再次无法让宏工作。我有以下 M(n)WE
\documentclass[10pt]{article}
\usepackage{pgfplotstable}
\begin{document}
\xdef\mydef{
\foreach \a/\b in {3/0,3/2,10/2,20/2,24/0,25/2}{%
every row no \a\ col no \b/.style={postproc cell content/.style={@cell content=\fbox{{##1}}}},}
}}
\pgfplotstableset{\mydef}
\end{document}
我正在尝试制作
\pgfplotstableset{
every row no 3 col no 0/.style={postproc cell content/.style={@cell content=\fbox{##1}}},
every row no 3 col no 2/.style={postproc cell content/.style={@cell content=\fbox{##1}}},
every row no 10 col no 2/.style={postproc cell content/.style={@cell content=\fbox{##1}}},
every row no 20 col no 2/.style={postproc cell content/.style={@cell content=\fbox{##1}}},
every row no 24 col no 0/.style={postproc cell content/.style={@cell content=\fbox{##1}}},
every row no 25 col no 2/.style={postproc cell content/.style={@cell content=\fbox{##1}}}
}
我想说我知道自己做错了什么,但我必须承认我完全不知道。任何帮助我都非常感谢。
另外,有没有一种简单的方法可以将列表作为参数传递给\def
或\xdef
宏?这将使最终的宏更具功能性。
答案1
该\xdef
命令仅执行扩张替换文本;它没有执行任务,这是\foreach
循环运行所必需的。
出路是\mydef
通过累积来构建。由于您还需要#
替换文本,因此令牌寄存器似乎是最佳选择:
\documentclass[10pt]{article}
\usepackage{pgfplotstable}
\begin{document}
\toks1={} % initialize the register to empty
\foreach \a/\b in {3/0,3/2,10/2,20/2,24/0,25/2}{%
\edef\temp{\the\toks1
every row no \a\ col no \b/.style={postproc cell
content/.style={@cell content=\noexpand\fbox{####1}}},}%
\global\toks1=\expandafter{\temp}
}
\edef\mydef{\the\toks1}
\pgfplotstableset{\mydef}
\end{document}
请注意,\the\toks1
在 阶段, 只会扩展一次\edef
:根据规则,令牌寄存器的内容将被传递但不会再扩展。您必须将 翻倍两次#
,这样它最终会在最终替换文本中“单独翻倍”。在 阶段\edef\temp
,\a
和\b
将被扩展,但不会\fbox
(这将是灾难性的)。
以下是我得到的结果\show\mydef
(为清晰起见添加了行尾):
> \mydef=macro:
->every row no 3\ col no 0/.style={postproc cell content/.style={@cell content=\fbox {##1}}},
every row no 3\ col no 2/.style={postproc cell content/.style={@cell content=\fbox {##1}}},
every row no 10\ col no 2/.style={postproc cell content/.style={@cell content=\fbox {##1}}},
every row no 20\ col no 2/.style={postproc cell content/.style={@cell content=\fbox {##1}}},
every row no 24\ col no 0/.style={postproc cell content/.style={@cell content=\fbox {##1}}},
every row no 25\ col no 2/.style={postproc cell content/.style={@cell content=\fbox {##1}}},.
对此的抽象可以如下:
\newcommand{\pashaset}[2]{%
\toks1={}%
\foreach \a/\b in {#2}{%
\edef\temp{\the\toks1
every row no \a\ col no \b/.style={postproc cell
content/.style={@cell content=\noexpand\fbox{########1}}},}%
\global\toks1=\expandafter{\temp}}%
\edef#1{\the\toks1}%
}
然后你可以打电话
\pashaset{\mydef}{3/0,3/2,10/2,20/2,24/0,25/2}
和\mydef
将像以前一样定义。请注意,#
必须再次加倍,因为它们现在出现在定义的替换文本中。
它们会发生什么情况?当 TeX 存储定义时,两个连续的#
会减少为一个。因此替换文本实际上包含####1
。当替换文本用于 时\edef
,它们会按照要求变成两个。