抱歉,标题太大,但我不知道如何将其表达为具体的内容,我尝试使用自定义命令在表中生成新列,例如:
\documentclass{scrbook}
\usepackage[nomessages]{fp}
\usepackage{ifthen}
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\newcommand{\newcoltest}[1]%my custom command
{
\ifthenelse{\isodd{#1}}
{\FPeval{\result}{clip(#1+1)}}
{\FPeval{\result}{clip(#1*3/2-1)}}
\result
}
\begin{document}
\pgfplotstableread{
T
1
2
3
4
5
6
7
8
9
10
}\loadedtable
\pgfplotstablecreatecol[
create col/assign/.code={%
\getthisrow{T}\vala
\edef\newentry{\noexpand\newcoltest{\vala}}%
\pgfkeyslet{/pgfplots/table/create col/next content}\newentry
}%
]{Sa}{\loadedtable}
\pgfplotstabletypeset[string type]\loadedtable%critic line
\end{document}
批评线是\pgfplotstabletypeset[string type]\loadedtable
,它只适用于string type
,当我更改为另一种类型甚至不放任何东西时,就会发生错误。
我把\noexpand
基于pgfplotstable:使用 create col/assign/.code 定义新列时使用命令吗?,因为如果没有这个,我认为我的命令就无法被识别。
我也无法使用它来绘制它tikz
,我认为这是相关的
答案1
像这样吗?
\documentclass{scrbook}
\usepackage{xfp}
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\newcommand{\newcoltest}[1]%my custom command
{%
\ifodd#1
\fpeval{trunc(#1+1)}%
\else
\fpeval{trunc(#1*3/2-1)}%
\fi
}
\begin{document}
\pgfplotstableread{
T
1
2
3
4
5
6
7
8
9
10
}\loadedtable
\pgfplotstablecreatecol[
create col/assign/.code={%
\getthisrow{T}\vala
\edef\newentry{\noexpand\newcoltest{\vala}}%
\pgfkeyslet{/pgfplots/table/create col/next content}\newentry
}%
]{Sa}{\loadedtable}
\pgfplotstabletypeset\loadedtable%critic line
\end{document}
我所做的就是让内容可扩展
- 从
fp
到xfp
,并且 - 而倾向于
ifthen
简单\ifodd
。
答案2
您使用的想法\noexpand
对我来说似乎很好,但却阻止了扩展:
下一个标记;
只有一次,即:如果你的
\newentry
受制于另一个\edef
,那么 将\noexpand
不再存在以防止 的扩张\newcoltest
——我想这一定是你在这里遇到麻烦的原因。
为了反驳第二点,LaTeX2e 的\protected@edef
和\protect
机制使用了一个巧妙的技巧,使保护在每次在专用宏\protected@edef
、\protected@write
等中使用时恢复。但 e-TeX 和派生引擎(包括 pdfTeX、LuaTeX 和 XeTeX)具有\protected
更强大的原语,因为它甚至可以在引擎原语(如\edef
和)中保护宏\write
,并且不需要使用\protect
。您只需将宏声明为\protected
,它就不会在、等中\edef
展开\write
。
xparse
的\NewDocumentCommand
宏(而不是\NewExpandableDocumentCommand
)会创建\protected
宏,因为这通常是最安全的做法,除非你真的知道你的宏是可扩展的。你可以非常简单地使用\NewDocumentCommand
来定义\newcoltest
来解决你的问题,甚至可以保留\ifthenelse
或\FPeval
其他“不可扩展的内容”在 的替换文本中。当然,在这种情况下\newcoltest
不需要,因为定义了受引擎保护的宏——就像你使用了 e-TeX 的原语一样。\noexpand
\NewDocumentCommand
\protected
\documentclass{article}
\usepackage[nomessages]{fp}
\usepackage{ifthen}
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\usepackage{xparse}
\ExplSyntaxOn % No spurious spaces this way!
\NewDocumentCommand \newcoltest { m }
{
\ifthenelse{\isodd{#1}}
{\FPeval{\result}{clip(#1+1)}}
{\FPeval{\result}{clip(#1*3/2-1)}}
\result
}
\ExplSyntaxOff
\begin{document}
\pgfplotstableread{
T
1
2
3
4
5
6
7
8
9
10
}\loadedtable
\pgfplotstablecreatecol[
create col/assign/.code={%
\getthisrow{T}\vala
\edef\newentry{\newcoltest{\vala}}%
\pgfkeyslet{/pgfplots/table/create col/next content}\newentry
}%
]{Sa}{\loadedtable}
\pgfplotstabletypeset[string type]\loadedtable
\end{document}
此外,由于您正在与 @Schrödinger'scat 讨论条件,您可能有兴趣了解具有expl3
强大的可扩展条件,例如\bool_if:nTF
,\str_case:nnTF
以及它们的所有变体(请参阅界面3.pdf看完之后expl3.pdf)。