我正在尝试创建一种更简单的方法来用 tex 编写多个作业的数学公式。目前,我快要成功了。这个例子可能看起来不太直观,但我不得不省略很多东西以使其足够小。
在此示例中,我试图完成的只是一些字符串替换。对于 \allvars 中定义的每个字符串,用 \varprint{string for \allvars} 输出的任何内容替换它们。但是,我把这里的扩展搞乱了,并尝试了其他几种方法,但我真的不太明白。字符串替换按预期工作,但我需要 StrSubstitute 在 allvars 中的下一个索引上重新运行其自己的输出。任何帮助都将不胜感激。
\documentclass[11pt]{article}
\usepackage{xinttools, xstring}
\newcommand{\allvars}{sideA,sideB,sideC}
\newcommand{\varPrint}[1]{%
great(#1)
} % just a command used in this example. in real document, a more advanced output is to be expected from this.
\newcommand{\matte}[1]{%
\edef\mattetempB{#1}
\xintFor ##1 in {\allvars}\do%
{\def\mattetempB{%
\StrSubstitute{\mattetempB}{##1}%
{\varPrint{##1}}%
}%
}%
\mattetemp
}%
\begin{document}
\matte{sideA+sideB=sideC},\\
Would like to see something like the following:\\
great(sideA)+great(sideB)=great(sideC)\\
But only sees:\\
sideA+sideB=great(sideC) ,
\end{document}
答案1
中的宏字符串直接打包输出文本,这些文本不能用于输入其他宏。要返回可用于进一步操作的文本,您可以使用尾随可选参数,该参数将保存在那里指定的宏中的输出。因此,不要像
\newcommand{\MySubst}{\StrSubstitute{abracadabra}{a}{o}}
您首先需要保存输出,然后进行定义:
\StrSubstitute{abracadabra}{a}{o}[\MyOutput]
\newcommand{\MySubst}{\MyOutput}
答案2
这是一个基于的更通用的版本l3regex
。
\documentclass{article}
\usepackage{xparse,l3regex,siunitx}
\ExplSyntaxOn
\prop_new:N \g_runart_variables_prop
\tl_new:N \l__runart_variables_matte_tl
\tl_new:N \l__runart_variables_item_tl
\NewDocumentCommand{\definevariable}{mm}
{ % #1 is the name, #2 is the formatting
\prop_gput:Nnn \g_runart_variables_prop { #1 } { #2 }
}
\NewDocumentCommand{\removevariable}{m}
{ % #1 is the name
\prop_gremove:Nn \g_runart_variables_prop { #1 }
}
\NewDocumentCommand{\matte}{m}
{ % #1 is the expression to output
\tl_set:Nn \l__runart_variables_matte_tl { #1 }
\prop_map_inline:Nn \g_runart_variables_prop
{
\tl_set:Nn \l__runart_variables_item_tl { ##2 }
\regex_replace_all:nnN
{ ##1 }
{ \u{l__runart_variables_item_tl} }
\l__runart_variables_matte_tl
}
\tl_use:N \l__runart_variables_matte_tl
}
\cs_new_protected:Nn \runart_variable_use:n
{
\prop_item:Nn \g_runart_variables_prop { #1 }
}
\ExplSyntaxOff
\definevariable{a_car}{\SI{20}{\metre\per\second}}
\definevariable{v_car}{\SI{40}{\metre}}
\definevariable{t_car}{\SI{2}{\second}}
\begin{document}
\[
\matte{
a_car=\frac{v_car}{t_car}
}
\]
\end{document}