你好,

我遇到了一些关于格式化数字的奇怪问题gt: gt ()对象,通过tinytex和四开本编织成PDF格式。请看这个小例子:

——title: "Reprex"格式:pdf: mainfont: Arial sansfont: Times New Roman——## A Header in Times New Roman \ ' ' ' ' {r} #| label: theIssue mtcars[,1:3] |> head(6) |> gt::gt() |> gt::fmt_number(列= 1,小数= 3)|> gt::tab_options(表。size = gt::px(6)) \ ' ' ' Arial字体。

如果我看一下输出,未格式化的数字是标准的Arial字体,而格式化的数字是斜体字体。仔细查看原始的.tex文件就会发现,格式化的数字被转换为数学模式——它们都被封装在$中。

有没有人能指引我走向正确的方向,怎么用力gt不以数学模式封装格式化的数字,而是以格式化的方式显示它们?我应该事先将所有数字转换为字符,看看它是否有效(主要问题是,我的“真实”表中的小数数量在行之间是不同的-例如,列中的行在整数(不需要小数)和百分比(需要一个数字)之间交替)。

提前感谢并致以亲切的问候

斜体问题是,这可能是藏物tinytex,因为有xelatex我看不出这是前驱物


标题:“Reprex”
pdf格式:
mainfont: Lato
monofont: Roboto

(我没有安装Ariel或Times New Roman)

对于交替行,默认值为gt(…Rows = everything()但是您可以提供行索引的向量,使奇数行和偶数行格式不同fmt_number ()调用。

1像

交替行已经完成了,我只是想强调一下这就是我需要的原因fmt_number ()首先。

我只是好奇,为什么gt把数字转换成数学模式。因为这样看起来真的很难看,而且与(表的其余部分和纯文本)不同步。

我还观察了偶数行的变换,并将其与未改变的奇数行进行了比较——变换后的行处于数学模式,即正常文本中的奇数行。

我能做些什么来防止这种行为吗?我的意思是,我可以输出.Tex表并手动将所有内容从数学模式更改为普通模式,但对于14个表或....来说,这真的很烦人

四开曲有很多力量和很多活动的部分——最终结束在pandoc在发送到PDF引擎之前。如果不深入挖掘这个开关是如何产生数学模式的,我们很难知道。

我想知道mainfont只适用于普通的PDF引擎,xelatex和相关的。看到S / O,指出fontfamily选项特别要求pdflatex.你可以考虑做一个完整的T_eX安装。

1像

嗯,这里不确定—针织至少声明它使用Xetex,并且在YAML中更改主字体选项也会影响纯文本上的字体。所以这至少是可行的。

我会尝试改变我的引擎,看看它是否解决了这个问题,但由于表保存与gt_save ()已经包含“错误”格式化的数字,我怀疑在gt级别上有一些东西我在这里错过了。

指定pdf-engine: xelatex将格式化数字的输出从数学模式更改为普通文本。没有此规范,数学模式将继续存在。

感谢您在YAML头文件中设置pdf引擎的建议!: slight_smile:

好吧,没关系。我只是将主字体和sans字体改为Source sans Pro来比较结果,现在显然又使用了另一种字体家族(我猜Calibri Math是数学语法的默认值?)

所以回到开头…该死的。

@technocrat这是我拥有的全部规范设置(不包括我也加载的一些.tex文件,但这些文件只影响标题页和参考书目的外观)。

- title: "Reprex"格式:pdf: documentclass: article classoption: a4paper number-sections: true fig-align: left fig-pos: 'h' tbl-cap-location: top fig-height: 4.3 fig-width: 6.1 font: "12pt" pdf-engine: xelatex mainfont: Arial sans - font: Arial include-in-header: text: | \usepackage{lipsum} - ## A Header \ ' ' ' {r} #| label: theIssue #| echo:假库(gt) my_table < - data.frame (var =代表(c(“数”、“共享”),2),组=代表(c(“男性”、“女性”),每个= 2),value_formatted = c (850 42.5 1150 57.5), value_unformatted = c (850 42.5 1150 57.5)) my_table | > gt (groupname_col =“集团”,rowname_col =“var”)| > fmt_number(列= 3,行= c(1,3),语言环境=“de_DE”,小数= 0)| > fmt_number(列= 3,行= c(2、4)地区=“de_DE”,小数= 2)| > tab_spanner(标签=“扳手”,列= 3:4)| > cols_label(。list = c('var' = ", 'group' = ", ' value_格式化' = ' value_格式化',' value_un格式化' = ' value_un格式化'))|> tab_脚注(脚注= "我也有一个脚注",位置= cells_column_spanners(spanners = 1)) \ '' '' \lipsum[5]

输出如下所示:

文本和未格式化的数字都在正确的字体族中,格式化的数字在数学模式下使用另一种字体族,这真的很难看(也违反了我必须遵循的一些样式规则)。

我的版本是“XeTeX,版本3.141592653-2.6-0.999994 (TeX Live 2022)”

也许你有其他解决办法?

编辑:在YAML中将mathfont指定为Arial也不会影响表示表中数字的外观。使用pdflatex只是禁用所有字体选项的使用,表号以及纯文本都在相同的字体系列中,但不是我需要的....

还在努力。用这个reprex我现在正在复制。当我使用pdflatex引擎都在数学模式。

1像

谢谢你的努力。我很感激。

如果您找不到任何内容,我想我必须手动删除格式化表中的所有$符号。: sweat_smile:但我不明白为什么gt将输出更改为数学模式,因为所有这些都是普通数字困惑:

当我取出pdf引擎时,它默认是数学样式。我在试tab_style现在的方法。

更新:这行不通。我转到*.tex文件并移动

\ usepackage {fontspec} \ setmainfont [] {Ariel}

到那一行特克斯立即在上面归档。

pdf文件是大家共同努力的结果四开gtpandocxelatex特克斯对于如此小的输出,文件相当冗长。我觉得它能起作用真是个奇迹。

你可以把问题放在github问题页面

标题\ {Reprex}

1像

非常感谢您的努力。我钻研了源代码gt: fmt_number ()GitHub上在这里(从第163行开始)。有一个函数调用gt::: num_fmt_factory_multi ()在第233行,它有参数use_latex_math_mode = TRUE(见在这里).这是指函数gt::: to_latex_math_mode ()(见在这里).

我认为,如果我可以改变这个函数的默认行为,无论格式化上下文是否在LaTeX中,都始终传递参数,那么这将防止通过将所有内容都用$符号包围而转换为数学模式。

但是我对包的开发和重新定义包的功能并没有那么深入。你有建议,如何重新定义这个函数总是传递不变的参数?

这就行了!!!!!

创建新函数num_fmt_factory_multi_ <- function(pattern, use_latex_math_mode = FALSE, format_fn) {names(all_contexts) <- all_contexts lapply(all_contexts, FUN = function(x) {num_fmt_factory(context = x, pattern = pattern, use_latex_math_mode = use_latex_math_mode),format_fn = format_fn)})} # https://stackoverflow.com/questions/24331690/modify-package-function #重新定义函数环境(num_fmt_factory_multi_) <- asNamespace('gt') assignInNamespace("num_fmt_factory_multi", num_fmt_factory_multi_, ns = "gt")

运行这个源()从.qmd文档内部更改默认格式为不使用LaTeX数学模式,即使我们在LaTeX环境中也是如此。桌子现在看起来就像它应该的那样!

我将在github问题页面上发布问题(和我的黑客解决方案),看看是否确实有一个更好的解决方案来重新定义我的功能。

2喜欢

凡人p-hack;硬核包破解!

此主题在最后一次回复后7天自动关闭。不再允许新的回复。

如果你有一个与它或其中一个回复相关的问题,开始一个新的主题,并引用一个链接。