仍在努力解决\expandafter
和\noexpand
tex 宏的问题。
我正在尝试使用 来整理一张表格pgfplotstable
。
在这种情况下,代码类似于
\documentclass{article}
\usepackage{pgfplotstable}
\def\outline{\noexpand\fbox{{##1}}}
\begin{document}
\pgfplotstableread[row sep=\\,col sep=&,header=false]{%
1 & 2 & 3 & 4\\%
5 & 6 & 7 & 8\\%
9 & 10 & 11 & 12\\%
}\mytable
\pgfplotstabletypeset[
debug,
column name={},
every row 2 column 1/.style={postproc cell content/.style={@cell content=\outline}}
]\mytable
\end{document}
并给出错误you can't use macro parameter character in horizontal restricted mode
。如果我退出,##1
它会用替换单元格内容##1
。
我最终想要做的是写出如下内容:
every row 2 column 1/.style=\outline
以及类似这样的宏
\def\outline{%
\{postproc cell content.style=%
\{@cell content=\noexpand\fbox{##1}\}\}}
我究竟做错了什么?
答案1
你走错了路:这个问题与扩张控制无关。
问题在于,您的调用\outline
没有传达参数 - 并且的定义\outline
没有定义参数,尽管它需要一个参数。
一旦解决了这两个问题,您就可以重新通过#1
进行逃脱##1
。
这似乎按预期工作:
\documentclass{article}
\usepackage{pgfplotstable}
\def\outline#1{\fbox{{#1}}}
\begin{document}
\pgfplotstableread[row sep=\\,col sep=&,header=false]{%
1 & 2 & 3 & 4\\%
5 & 6 & 7 & 8\\%
9 & 10 & 11 & 12\\%
}\mytable
\pgfplotstabletypeset[
debug,
column name={},
every row 2 column 1/.style={postproc cell content/.style={@cell content=\outline{##1}}}
]\mytable
\end{document}
我改变了 的定义\outline
(\def
要求您在定义中列出预期的参数)和 的调用\outline
。请注意,后者实际上需要##1
(因为在该上下文中#1
是 的参数every row 2 column 1
,而您希望 是 的参数postproc cell content
)。
编辑:
关于你问题的第二部分以及你对此答案的评论:是的,可能可以通过扩展到键值赋值的宏来定义样式。但这显然不是最佳实践。事实上,如果它有效,那可能是运气。
如果你想有某种风格,比如“勾勒出这个单元格”,那么你最好使用某种
% preamble:
\pgfplotstableset{
outline/.style={postproc cell content/.style={@cell content=\outline{##1}}}
}
%code:
\pgfplotstabletypeset[
debug,
column name={},
every row 2 column 1/.style={outline},
]\mytable