是否可以扩展字符串中的标记,就像它们是在源文件中的该位置输入的一样?我正在尝试做这样的事情:
\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}