我是一个有志于成为 LaTeX 的用户,到目前为止,我已经完成了第一步,并创建了我的前几个文档。由于我有编程背景,所以我一直想知道如何使用它来\newcommand
创建一个以硬编码方式格式化数字或字符串的命令。
例如,假设我有字符串 AB1234567890。现在我想要做的是创建一个命令,使用方式如下
\applyformat{AB1234567890}
应该创建输出
AB12 3456 7890
我意识到类似的事情可以做\,
AB12\,3456\,7890
但我想在命令中定义一个固定的“布局”,以确保每个字符串的格式都与我稍后对每个字符串使用该命令的方式相同。
在编程语言中我可以拆分字符串等,但我不知道如何使用 LaTeX 解决这个问题。
答案1
你可以使用包裹xstring
:
笔记:
- 增强版可从以下网址获取:在文本块内添加空格。
- 此代码的限制为400个字符,因此请
\foreach
根据需要调整结束值。 - 默认情况下,拆分是从左侧进行的。如果您希望从右侧进行拆分,则需要将除 之外的其他内容传入第一个可选参数
L
。
代码:
\documentclass{article}
\usepackage{xstring}
\usepackage{pgf,pgffor}
\newcommand*{\StringLength}{}%
\newcommand*{\FirstOutputStringLength}{}%
\newcommand*{\TempStringA}{}%
\newcommand*{\TempStringB}{}%
\newcommand*{\applyformat}[2][L]{%
\edef\TempStringA{#2}%
\IfStrEq{#1}{L}{%
\foreach \x in {1,...,100} {%
\StrLeft{\TempStringA}{4}\,%
\StrGobbleLeft{\TempStringA}{4}[\TempStringB]%
\xdef\TempStringA{\TempStringB}%
\IfStrEq{\TempStringA}{}{\breakforeach}{}%
}%
}{%
\StrLen{\TempStringA}[\StringLength]%
\IfEq{\StringLength}{0}{}{%
\pgfmathtruncatemacro{\FirstOutputStringLength}{mod(\StringLength,4)}%
\IfEq{\FirstOutputStringLength}{0}{%
\xdef\TempStringB{\TempStringA}%
}{%
\StrLeft{\TempStringA}{\FirstOutputStringLength}\,%
\StrGobbleLeft{\TempStringA}{\FirstOutputStringLength}[\TempStringB]%
}%
}%
\applyformat[L]{\TempStringB}%
}%
}
\begin{document}
\begin{tabular}{ll}
\multicolumn{1}{c}{Left} & \multicolumn{1}{c}{Right} \\
\applyformat{AB1234567890} & \applyformat[R]{AB1234567890}\\
\applyformat{AB123456789} & \applyformat[R]{AB123456789}\\
\applyformat{AB12345678} & \applyformat[R]{AB12345678}\\
\applyformat{AB1234567} & \applyformat[R]{AB1234567}\\
\applyformat{AB12} & \applyformat[R]{AB12}\\
\applyformat{AB} & \applyformat[R]{AB}\\
\applyformat{A} & \applyformat[R]{A}\\
\end{tabular}
\end{document}