在调试宏时,我发现了这种奇怪的行为(奇怪的是,我的意思是我没有能力理解为什么它会这样,以及它是一个错误还是一个功能......)。
本 MWE 编译:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn\mytable:n {
\begin{tabular}{c}
\hline
test \\
\hline
\end{tabular}
}
\newcommand{\mytable}{\mytable:n}
\ExplSyntaxOff
\begin{document}
\mytable
\end{document}
但是这个不会:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn\mytable:n {
\begin{tabular}{c}
\bool_set_true:N\myvar % <--- Here the change
\hline
test \\
\hline
\end{tabular}
}
\newcommand{\mytable}{\mytable:n}
\ExplSyntaxOff
\begin{document}
\mytable
\end{document}
我的直觉告诉我,除了定义一些其他宏或在寄存器中存储一些标记外,该\bool_set_true:N
函数不会对输入/输出做任何有意义的事情,但我想这证明我错了......有人可以给我提供更好的直觉吗?
(笔记:阅读评论后,\hline
(\def
等)之前的任何内容都会引发问题)
答案1
\hline
使用名为 的 TeX 基元\noalign
,它仅当它是表格行中的第一个(不可扩展)标记时才有效。\bool_set_true:N
执行赋值,因此它不可扩展并在那里中断。使用(赋值)或(不可扩展标记)或(不可扩展标记)\hline
时,您会得到相同的错误:\def\x{} \hline
\relax \hline
\relax
a \hline
a
\documentclass{article}
\begin{document}
\begin{tabular}{c}
% \def\x{} \hline
% \relax \hline
% a \hline
\hline
test \\
\hline
\end{tabular}
\end{document}
如果你真的想把作业放在那里,你可以把它放在那里里面 \noalign
(同一行中可以有多个\noalign
s)。请注意,分配必须是全局的,否则在\noalign
结束时会恢复:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\bool_show:N \g_tmpa_bool
\begin{tabular}{c}
\noalign{ \bool_gset_true:N \g_tmpa_bool }
\hline
test \\
\hline
\end{tabular}
\bool_show:N \g_tmpa_bool
\end{document}