将宏扩展为长列表以便与 pgfplotstable 一起使用

将宏扩展为长列表以便与 pgfplotstable 一起使用

再次无法让宏工作。我有以下 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,它们会按照要求变成两个。

相关内容