![将 \input 与 siunitx 的 \num 结合使用](https://linux22.com/image/450389/%E5%B0%86%20%5Cinput%20%E4%B8%8E%20siunitx%20%E7%9A%84%20%5Cnum%20%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8.png)
在我实现的自动字数统计中(改编自此解决方案),只有计数,没有其他内容输出到文本文件,然后插入到 tex 文档中\input
。这很好用,但与 siunitx 的\num
数字格式结合使用时则不行,会产生错误。问题可能是\input
自动添加的换行符。我尝试用这个来绕过换行符解决方案没有帮助。我该如何做才能让它起作用?
\documentclass{article}
\usepackage[group-minimum-digits=4,group-separator={,}]{siunitx}
\begin{filecontents*}{\jobname_wordcount.txt}
1234
\end{filecontents*}
\newcommand\minput[1]{% doesn't help
\input{#1}%
\ifhmode\ifnum\lastnodetype=11 \unskip\fi\fi}
\begin{document}
\input{\jobname_wordcount.txt}words % works
% \num\input{\jobname_wordcount.txt}words % causes error
\end{document}
答案1
您也可以将文件的内容加载到标记列表中,并将其用作 的参数\num
。
\documentclass{article}
\usepackage[group-minimum-digits=4,group-separator={,}]{siunitx}
\begin{filecontents*}{\jobname_wordcount.txt}
1234
\end{filecontents*}
\ExplSyntaxOn
\NewDocumentCommand{\numinput}{O{}m}
{
\file_get:nnN { #2 } { } \l_tmpa_tl
\num[#1]{\l_tmpa_tl}
}
\ExplSyntaxOff
\begin{document}
\numinput{\jobname_wordcount.txt} words
\numinput[group-separator={\,}]{\jobname_wordcount.txt} words
\end{document}
无需expl3
您使用即可catchfile
达到相同目的。
\documentclass{article}
\usepackage[group-minimum-digits=4,group-separator={,}]{siunitx}
\usepackage{catchfile}
\begin{filecontents*}{\jobname_wordcount.txt}
1234
\end{filecontents*}
\makeatletter
\newcommand{\numinput}[2][]{%
\CatchFileDef{\numinput@text}{#2}{}%
\num[#1]{\numinput@text}%
}
\makeatother
\begin{document}
\numinput{\jobname_wordcount.txt} words
\numinput[group-separator={\,}]{\jobname_wordcount.txt} words
\end{document}
答案2
未来的某一天(可能很快),该functional
包将支持可选参数和包装器file_get
,您可以使用它。
现在,您可以通过定义另一个包装层来解决问题。
%! TEX program = lualatex
\documentclass{article}
\usepackage{functional}
\usepackage[group-minimum-digits=4,group-separator={,}]{siunitx}
\begin{filecontents*}{\jobname_wordcount.txt}
1234
\end{filecontents*}
\ExplSyntaxOn
\PrgNewFunction \fileGet {m} {
\file_get:nnN { #1 } { } \gResultTl
}
\PrgNewFunction \numWrapperInner {mm} {
\num[#1]{#2}
}
\NewDocumentCommand{\numWrapper}{O{}m}
{
\numWrapperInner{#1}{#2}
}
\ExplSyntaxOff
\begin{document}
\numWrapper{1234} words % use normally
\numWrapper{\fileGet{\jobname_wordcount.txt}} words % use with fileGet function
\numWrapper[group-separator={\,}]{\fileGet{\jobname_wordcount.txt}} words % and optional argument
\end{document}
(注意,同样的原理也可以用于其他参数类型/参数预处理器等。)