我有#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
单位,因为这是您要添加的垂直空间)。