传递值或宏时的不同行为

传递值或宏时的不同行为

我正在尝试使用 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将其设置为等于这个值。

相关内容