我正在尝试使用 OCRB 字体填写表格。我需要在金额的每个数字后添加空格。下面是我的命令:
\newcommand*\giro@bvramount[1]{
\let\@tempa\relax
\@tfor\@tempb:=#1\do {\@tempa \@tempb \let\@tempa\ }%
}
当我用数字调用命令时,它按预期工作:
\giro@bvramount{485.99}
-> '4 8 5 . 9 9'
但是当我使用宏时,如果不起作用:
\def\@amount{485.99}
\giro@bvramount{\@amount}
-> '485.99'
上下文中的实际调用是:
\hfill\ocrb\giro@bvramount{\giro@amount}
我很高兴了解这里发生的事情:-)
答案1
如果你分两步进行:
\newcommand*\giro@bvramountaux[1]{%
\let\@tempa\relax
\@tfor\@tempb:=#1\do {\@tempa \@tempb \let\@tempa\ }%
}
\newcommand*\giro@bvramount[1]{%
\expandafter\giro@bvramount\expandafter{#1}%
}
那么\giro@bvramount{485.99}
和都\giro@bvramount\@amount
可以起作用。
但这并不是最好的解决方法。
\documentclass{article}
\makeatletter
\newcommand*\giro@bvramount@aux[1]{%
\if\relax\detokenize{#1}\relax
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{\giro@bvramount@auxi#1\@nil}%
}
\def\giro@bvramount@auxi#1#2\@nil{%
#1%
\@tfor\next:=#2\do{ \next}%
}
\newcommand*\giro@bvramount[1]{%
\expandafter\giro@bvramount@aux\expandafter{#1}%
}
\def\@amount{485.99}
\makeatother
\begin{document}
\makeatletter
X\giro@bvramount{485.99}X
X\giro@bvramount\@amount X
X\giro@bvramount{\@amount}X
X\giro@bvramount{1}X
\makeatother
\end{document}
有了expl3
它显然就更容易了:
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_protected:Nn \giro_bvramount:n
{
\seq_set_split:Nnx \l_tmpa_tl {} { #1 }
\seq_use:Nn \l_tmpa_tl { ~ }
}
\cs_generate_variant:Nn \seq_set_split:Nnx { Nnn }
\ExplSyntaxOff
答案2
正如评论中提到的,您需要先扩展,\@amount
然后再将其提供给\giro@bvramount
。以下是使用以下方法执行此操作的方法LaTeX3:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand\InsertSpaces[1]{
\tl_set:No \l_tmpa_tl {#1}
\regex_replace_all:nnN { . } { \0\ } \l_tmpa_tl
\l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\InsertSpaces{485.99}
\def\amount{485.99}
\InsertSpaces{\amount}
\end{document}
其中o
,\tl_set:No
表示#1
应该扩展一次,然后\l_tmpa_tl
将其设置为等于这个值。