将 \input 与 siunitx 的 \num 结合使用

将 \input 与 siunitx 的 \num 结合使用

在我实现的自动字数统计中(改编自此解决方案),只有计数,没有其他内容输出到文本文件,然后插入到 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}

(注意,同样的原理也可以用于其他参数类型/参数预处理器等。)

相关内容