扩展问题

扩展问题

我正在尝试创建一种更简单的方法来用 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}

在此处输入图片描述

相关内容