newcommand、pgfplotsinvokeforeach、expl3:如何处理多个‘#…’类型的参数

newcommand、pgfplotsinvokeforeach、expl3:如何处理多个‘#…’类型的参数

我有#1我的 newcommand。
我有##1我的 pgfplotsinvokeforeach-loop。

现在我需要类似###1我的比较方法“ \fpcompareTF{##1<0}{333}{##1}”的东西。

这里正确的方法是什么?

在此处输入图片描述

\documentclass[a4paper, landscape=false]{article}
\usepackage{amsmath, amssymb, amsfonts}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}

% fp-compare 
\usepackage{xfp}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\fpcompareTF}{mmm}
 {
  \fp_compare:nTF { #1 } { #2 } { #3 }
 }
\ExplSyntaxOff

\begin{document}
\section{Works}
\pgfplotsinvokeforeach{1,...,3}{ % ----
\noindent\pgfplotstabletypeset[col sep=comma, row sep=\\,]{ 
#1, #1, 333 \\
} \\[1em]
}% ----

\section{Works not}

\newcommand\Test[1]{
\pgfplotsinvokeforeach{1,...,#1}{ % ----
\noindent\pgfplotstabletypeset[col sep=comma, row sep=\\,
every column/.code={
\pgfkeysalso{postproc cell content/.style={
@cell content={
\fpcompareTF{##1<0}{333}{##1}%
}
}}},
]{ 
##1, ##1, -1 \\
} \\[1em]
}% ----
}
\Test{5}

\end{document}

答案1

我建议如下:

\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}

\usepackage{xfp}
\ExplSyntaxOn
\NewExpandableDocumentCommand {\fpcompareTF} { m m m }
  {
    \fp_compare:nTF { #1 } { #2 } { #3 }
  }
\ExplSyntaxOff

\newcommand*\Test[1]{%
   \pgfplotsinvokeforeach{1,...,#1}{%
      \noindent\pgfplotstabletypeset[col sep=comma, row sep=\\,
        every column/.style={
          postproc cell content/.style={
            % /utils/exec={\message{Debug: #1, ##1, ########1^^J}},
            @cell content={\fpcompareTF{########1<0}{333}{########1}}
          }},
        ]{
        ##1, ##1, -1\\
      }%
      % Don't write the \\[1em] after the last line, otherwise this triggers an
      % underfull \hbox.
      \ifnum ##1<#1\relax \\[1em]\fi
   }%
}

\begin{document}

\Test{5}

\end{document}

截屏

  • 在 的替换文本里面\Test#1被 的参数替换\Test

  • 向下一级,在的第二个强制参数中\pgfplotsinvokeforeach,被替换为与正在迭代的##1内容相对应的标记。\pgfplotsinvokeforeach

  • 下一个级别位于第一个样式定义内:####1将表示样式的第一个参数/pgfplots/table/every column,但是该样式不接受任何参数。

  • 最后,在最内层样式的定义中/pgfplots/table/postproc cell content,样式的第一个参数可用为########1(八个#字符标记,因为 8 = 2 3)。

如果你取消注释我的调试行:

/utils/exec={\message{Debug: #1, ##1, ########1^^J}},

您将在 LaTeX 终端输出中看到以下内容:

Debug: 5, 1, 1
Debug: 5, 1, 1
Debug: 5, 1, -1
Debug: 5, 2, 2
Debug: 5, 2, 2
Debug: 5, 2, -1
Debug: 5, 3, 3
Debug: 5, 3, 3
Debug: 5, 3, -1
Debug: 5, 4, 4
Debug: 5, 4, 4
Debug: 5, 4, -1
Debug: 5, 5, 5
Debug: 5, 5, 5
Debug: 5, 5, -1

作为一项小改进,我将您的替换\\[1em]

\ifnum ##1<#1\relax \\[1em]\fi

否则,最后一个\\[1em]单独位于段落末尾,会导致文本不完整\hbox(注意:您可以使用ex单位,因为这是您要添加的垂直空间)。

相关内容