将参数存储在字符串中以供 \tabbing 使用

将参数存储在字符串中以供 \tabbing 使用

我有一个宏,它将一些字符串存储在 \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}

输出如上。

相关内容