存储一系列 token 以供后续评估

存储一系列 token 以供后续评估

是否可以扩展字符串中的标记,就像它们是在源文件中的该位置输入的一样?我正在尝试做这样的事情:

\begin{vmatrix}
\@for\tmpone:=a,b,c\do{%
  \def\thisrow{}%
  \@for\tmptwo:=d,e,f\do{%
    \expandafter\xdef\expandafter\thisrow{\thisrow & \string\foo{\tmpone}{\tmptwo}}
  }
  \thisrow
}
\end{vmatrix}

不同之处在于我希望现在的字符串thisrow被扩展,而不仅仅是将其复制为字符串。这样可以吗?

请注意,这\foo不一定是一个“强健”的命令。

附录 有些人要求我说得更具体一些,我认为问题如下:

\documentclass{article}
\usepackage{amsmath}
\newcommand*{\foo}[3]{%
  \def\silly{#3}%
  % more code
  \left(\frac{\partial #1}{\partial #2}\right)_{#3}}%
\begin{document}
\[ \begin{vmatrix}
\makeatletter
    \@for\tmpone:=f,g,h\do{%
      \def\thisrow{}%
      \@for\tmptwo:=x,y,z\do{%
        \expandafter\xdef\expandafter\thisrow\expandafter{\thisrow & \noexpand\foo{\tmpone}{\tmptwo}{oeu}}
      }
      \thisrow \\[1.25ex]
    }
\makeatother
  \end{vmatrix}
\]
\end{document}

如果我注释掉\def定义中的那一行\foo,它就可以起作用。

其中定义宏的任何构造\foo似乎都会导致未定义的控制序列错误或额外的“}”错误。

@DavidCarlisle 回答了我的问题,是否有可能采取一系列在人类看来是可扩展的 TeX 宏(但使用 连接起来\string)的标记并对其进行扩展,答案是,正如我所担心的,“不能”。

答案1

您可以使用\protected\def\foo和 否\expadafter, 否\noexpand

\documentclass{article}
\usepackage{amsmath}
\protected\def\foo#1#2#3{%
  \def\silly{#3}%
  % more code
  \left(\frac{\partial #1}{\partial \lower.2ex\vbox{}#2}\right)_{#3}}%
\begin{document}
\[ \begin{vmatrix}
\makeatletter
    \@for\tmpone:=f,g,h\do{%
      \def\thisrow{}%
      \@for\tmptwo:=x,y,z\do{%
        \xdef\thisrow{\ifx\thisrow\empty\else \thisrow &\fi\foo{\tmpone}{\tmptwo}{oeu}}
      }
      \if\tmpone h \thisrow\else \thisrow \\[1.25ex] \fi
    }
\makeatother
  \end{vmatrix}
\]
\end{document}

您的思维方式更接近纯 TeX 而不是 LaTeX,因此也许您会对纯 TeX 或 OpTeX 感到满意(可以\foreach使用宏):

\fontfam[lm]
\protected\def\jelement#1#2{\displaystyle{\partial#1\overwithdelims()\partial#2}}
\def\jacobian#1#2{\def\jdata{}
   \foreach #1\do{\let\jrow=\ignoreit
      \foreach #2\do{\edef\jrow{\jrow & \jelement{##1}{####1}}}
      \edef\jdata{\ifx\jdata\empty \else\jdata \cr\noalign{\kern.5ex} \fi \jrow}
    }
    \left|\matrix{\jdata}\right|
}

$$
\jacobian{fgh}{xyz}
$$

\bye

答案2

\expandafter\thisrow{\thisrow

将扩展应用于{不可扩展的,你想要

\expandafter\thisrow\expandafter{\thisrow

答案3

我猜你想要这样的东西:

\documentclass{article}
\usepackage{amsmath}
\usepackage{thermodynamics}

\ExplSyntaxOn

\NewDocumentCommand{\newJacobian}{mmm}
 {% #1 = list of functions, #2 = list of variables, #3 = subscript
  \begin{vmatrix}
  \thermodynamics_jacobian:nnn { #1 } { #2 } { #3 }
  \end{vmatrix}
 }

\seq_new:N \l__thermodynamics_row_seq
\seq_new:N \l__thermodynamics_full_seq

\cs_new_protected:Nn \thermodynamics_jacobian:nnn
 {
  \seq_clear:N \l__thermodynamics_full_seq
  \clist_map_inline:nn { #1 }
   {
    \seq_clear:N \l__thermodynamics_row_seq
    \clist_map_inline:nn { #2 }
     {
      \seq_put_right:Nn \l__thermodynamics_row_seq { \displaystyle\Partial{##1}{####1}{#3} }
     }
    \seq_put_right:Nx \l__thermodynamics_full_seq { \seq_use:Nn \l__thermodynamics_row_seq { & } }
   }
  \seq_use:Nn \l__thermodynamics_full_seq { \\[2ex] }
 }

\ExplSyntaxOff

\begin{document}

\[
\newJacobian{F,G,H}{x,y,z}{P}
\]

\end{document}

在此处输入图片描述

相关内容