我有一个宏,它将一些字符串存储在 \step0、\step1、\step2... 中。我使用字符“a”作为占位符,将其替换为 \ = 或 \ >(用于 \tabbing 环境)。我希望使用 xstring 包中的 \StrSubstitute 宏部分进行实际替换,但显然我做错了。似乎我使用的 \textbackslash 无法识别为 \(错误的 catcode?)。我该如何修复?
这里有一段代码来展示我所期望的和我实际得到的结果。
\documentclass[12pt, a4paper]{article}
\usepackage{xstring}
\usepackage{pgf,tikz}
\usepackage{mathrsfs}
\usepackage{ifthen}
\begin{document}
\large
%%%%%% what It should do...
\begin{tabbing}
G\= = 9 \= - 2 \= × 3 \\
G\> = 9 \> - \>6 \\
G\> = \>1
\end{tabbing}
%%%%%%% what it does
\expandafter\xdef\csname step0\endcsname{G a= 9 a- 2 a× 3} %define \step0
\expandafter\xdef\csname step1\endcsname{G a= 9 a- a6} %define \step1
\expandafter\xdef\csname step2\endcsname{G a= aa1 } %define \step2
\def\textbuffer{
\StrSubstitute{dummy}{dummy}{\csname step0\endcsname}[\buffer] % puts \step1 in \buffer
\StrSubstitute{\buffer}{a}{\textbackslash=} \textbackslash\textbackslash %replaces "a" by \= and writes line 0
\foreach \k in {1,...,2}{
\StrSubstitute{dummy}{dummy}{\csname step\k\endcsname}[\buffer] % puts \step\k in \buffer
\StrSubstitute{\buffer}{a}{\textbackslash>}
\ifthenelse{\k=2}{}{\textbackslash\textbackslash} %replaces "a" by \= and writes line k
}
}
\begin{tabbing}
\textbuffer % tries to use \textbuffer as argument to \tabbing
\end{tabbing}
\end{document}
答案1
以下使用\tl_replace_all:Nnn
来自expl3
-programming 层而不是xstring
函数。我还更改了您的输入语法,使其不使用具有数字名称的多个辅助宏,而是使用包含每行作为支撑组的单个参数。
\documentclass[12pt, a4paper]{article}
\ExplSyntaxOn
\tl_new:N \l__funkiephil_tmp_tl
\NewDocumentCommand \funkietab { O{a} m }
{
\funkiephil_replace:nnx {#1} \= { \tl_head:n {#2} }
\tl_map_tokens:en { \tl_tail:n {#2} } { \\ \funkiephil_replace:nnn {#1} \> }
}
\cs_generate_variant:Nn \tl_map_tokens:nn { e }
\cs_new_protected:Npn \funkiephil_replace:nnn #1#2#3
{
\tl_set:Nn \l__funkiephil_tmp_tl {#3}
\tl_replace_all:Nnn \l__funkiephil_tmp_tl {#1} {#2}
\l__funkiephil_tmp_tl
}
\cs_generate_variant:Nn \funkiephil_replace:nnn { nnx }
\ExplSyntaxOff
\begin{document}
%%%%%% what It should do...
\begin{tabbing}
G\= = 9 \= - 2 \= × 3 \\
G\> = 9 \> - \>6 \\
G\> = \>1
\end{tabbing}
\begin{tabbing}
\funkietab {
{G a= 9 a- 2 a× 3}
{G a= 9 a- a6}
{G a= aa1}
}
\end{tabbing}
\end{document}
以下是使用step<num>
符号的替代方法(实际上,只要是数字,它就支持任意命名方案)。新宏采用一个可选参数,给出应由或替换的字符(序列)\=
(\>
默认为a
),一个强制参数,指定变量的命名方案(用于#1
数字部分),一个可选参数,给出第一个索引(默认为0
),以及一个强制参数,指定最后一个。
\documentclass[12pt, a4paper]{article}
\ExplSyntaxOn
\tl_new:N \l__funkiephil_tmp_tl
\cs_new:Npn \__funkietab_name:n #1 {}
\NewDocumentCommand \funkietab { O{a} m O{0} m }
{
\cs_gset:Npn \__funkietab_name:n ##1 {#2}
\funkiephil_replace:nnn {#1} \= {#3}
\int_step_inline:nnn { #3 + 1 } {#4}
{ \\ \funkiephil_replace:nnn {#1} \> {##1} }
}
\cs_new_protected:Npn \funkiephil_replace:nnn #1#2#3
{
\tl_set_eq:Nc \l__funkiephil_tmp_tl { \__funkietab_name:n {#3} }
\tl_replace_all:Nnn \l__funkiephil_tmp_tl {#1} {#2}
\l__funkiephil_tmp_tl
}
\ExplSyntaxOff
\begin{document}
%%%%%% what It should do...
\begin{tabbing}
G\= = 9 \= - 2 \= × 3 \\
G\> = 9 \> - \>6 \\
G\> = \>1
\end{tabbing}
\expandafter\xdef\csname step0\endcsname{G a= 9 a- 2 a× 3} %define \step0
\expandafter\xdef\csname step1\endcsname{G a= 9 a- a6} %define \step1
\expandafter\xdef\csname step2\endcsname{G a= aa1 } %define \step2
\begin{tabbing}
\funkietab{step#1}{2}
\end{tabbing}
\end{document}
输出如上。