You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R Shiny中selectizeInput含LaTeX长文本的渲染问题求助

在Shiny SelectizeInput中实现带希腊字母的长文本自动换行与默认字体渲染

已查阅过相关帖子,但核心需求并非仅显示希腊字母,而是要同时呈现普通文字与希腊字母,且长文本存在截断问题,现说明详情并寻求解决方案:

测试示例代码

library(shiny)

ui <- shinyUI(
  fluidPage(
    tags$head(
      tags$link(rel="stylesheet", 
                href="https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.css", integrity="sha384-9tPv11A+glH/on/wEu99NVwDPwkMQESOocs/ZGXPoIiLE8MU/qkqUcZ3zzL+6DuH", 
                crossorigin="anonymous"),
      tags$script(src="https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.js", integrity="sha384-U8Vrjwb8fuHMt6ewaCy8uqeUXv4oitYACKdB0VziCerzt011iQ/0TqlSlv8MReCm", 
                  crossorigin="anonymous")
    ),
    selectizeInput(
      inputId = "test_id", 
      label = "test_label", 
      choices = list("\\text{hahaha } \\omega \\text{ hahaha insert more text please help me...}" = 1,
                     "\\text{hahaha } \\beta \\text{ hahaha}" = 2),
      options = list(render = I("
      {
        item: function(item, escape) { 
                var html = katex.renderToString(item.label);
                return '<div>' + html + '</div>'; 
              },
        option: function(item, escape) { 
                  var html = katex.renderToString(item.label);
                  return '<div>' + html + '</div>'; 
                }
      }")
      )
    )
  )
)

server <- function(input, output, session){  
  # server side code here...
}

shinyApp(ui = ui, server = server)

加载应用后可见文本被轻微截断(且不想加宽sidebarlayout),需求如下:

  • 实现长文本自动换行,避免内容截断
  • 使用Shiny基础字体,不再依赖LaTeX的\text{}格式,期望效果为:普通文字用Shiny默认字体,希腊字母正常显示,长文本自动换行

补充:试过手动添加\\newline换行,但并非最优解。


解决方案

核心思路

  1. 用Unicode希腊字母替代LaTeX语法,直接与普通文本组合,自动继承Shiny默认字体,无需\text{}包裹
  2. 自定义CSS样式,让SelectizeInput的选中项和下拉选项支持自动换行,适配容器宽度

修改后完整代码

library(shiny)

ui <- shinyUI(
  fluidPage(
    tags$head(
      # 自定义CSS实现自动换行
      tags$style(HTML("
        /* 下拉选项自动换行 */
        .selectize-dropdown-content .option {
          white-space: normal !important;
          max-width: 100%;
        }
        /* 选中项自动换行 */
        .selectize-control.single .item {
          white-space: normal !important;
          overflow: visible;
        }
      "))
    ),
    selectizeInput(
      inputId = "test_id", 
      label = "test_label", 
      choices = list(
        "hahaha ω hahaha insert more text please help me..." = 1,
        "hahaha β hahaha" = 2
      ),
      options = list(
        dropdownParent = "body" # 确保下拉菜单适配容器宽度
      )
    )
  )
)

server <- function(input, output, session){  
  # server side code here...
}

shinyApp(ui = ui, server = server)

说明

  • 移除了Katex依赖,直接使用Unicode希腊字母(如ω、β),普通文本自动使用Shiny基础字体,完全符合字体需求
  • 通过CSS设置white-space: normal强制文本自动换行,max-width:100%确保内容不超出容器范围,无需加宽sidebarlayout
  • 代码更简洁,渲染效率更高,避免了LaTeX语法带来的字体不一致问题

内容的提问来源于stack exchange,提问作者annahuynhly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:57:53