我发现它tabular
似乎无法按预期工作\ExplSyntaxOn...\ExplSyntaxOff
,我怀疑这是因为空格的处理方式。对吗?
这是 MWE。除其他事项外,似乎\tabularnewline
未观察到。
% !TEX program = lualatexmk
% !TEX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{array}
\usepackage[left=1in,right=1in]{geometry}
\ExplSyntaxOn
\NewDocumentCommand{\zzzz}{ m }
{%
\begin{center}
\begin{tabular}{>{\bfseries\small}p{0.5\linewidth} p{0.1\linewidth} p{0.1\linewidth} p{0.1\linewidth}}
name & & & \tabularnewline
\ttfamily\footnotesize{\token_to_str:c #1} & & & \tabularnewline
\end{tabular}
\begin{tabular}{>{\small}p{0.25\linewidth} >{\small}p{0.25\linewidth} >{\small}p{0.25\linewidth}}
base & derived & alternate \tabularnewline
\footnotesize{BU} &
\footnotesize{DU} &
\footnotesize{AU}
\end{tabular}
\end{center}
}%
\ExplSyntaxOff
\begin{document}
Hello.
\zzzz{something}
\end{document}
答案1
有趣的例子!问题确实是忽略了 中的空格\ExplSyntaxOn
,但原因并非你所想的那样。我将\fbox
在表格周围添加 es,以帮助你更好地看到这个问题:
看到第二个表格紧挨着第一个表格,并且溢出了页面边框吗?事实上,如果你查看终端,你会看到:
Overfull \hbox (342.37389pt too wide) in paragraph at lines 28--28
意思是:你的线342 pt
太宽了(为了比较,标准类设置\linewidth=345pt
,所以这是一个全部的\linewidth
太大了!)。
问题是,如果你用“正常语法”来写这个:
\begin{tabular}{...}
...
\end{tabular} % <-- here
\begin{tabular}{...}
...
\end{tabular}
水平列表将包含<table><space><table>
,因此它们之间可以换行,而在expl3
语法中,标记行中的空格将被忽略,因此表格将“粘合”在一起,因此它们会溢出页面。这与z<newline>z
在两种情况下键入的内容完全相同:在expl3
语法中,您将zz
在 PDF 中看到 ,而在正常语法中,您将看到z z
。
在第一个之后添加一个~
(或一个)将使其起作用:\par
\end{tabular}
\documentclass{article}
\usepackage{array}
\usepackage[left=1in,right=1in]{geometry}
\ExplSyntaxOn
\NewDocumentCommand{\zzzz}{ m }
{%
\begin{center}
\dim_set:Nn \fboxrule { 1sp } \dim_set:Nn \fboxsep { 0pt }
\fbox{\begin{tabular}{>{\bfseries\small}p{0.5\linewidth} p{0.1\linewidth} p{0.1\linewidth} p{0.1\linewidth}}
name & & & \tabularnewline
\ttfamily\footnotesize{\token_to_str:c {#1}} & & & \tabularnewline
\end{tabular}}~
\fbox{\begin{tabular}{>{\small}p{0.25\linewidth} >{\small}p{0.25\linewidth} >{\small}p{0.25\linewidth}}
base & derived & alternate \tabularnewline
\footnotesize{BU} &
\footnotesize{DU} &
\footnotesize{AU}
\end{tabular}}
\end{center}
}%
\ExplSyntaxOff
\begin{document}
Hello.
\zzzz{something}
\end{document}
通常不建议在书写时使用这种expl3
语法,因为用波浪线代替空格很麻烦,而且有时问题更难发现(您刚刚看到了这种情况 :)。如果您只想expl3
在普通文本中使用某些功能(在本例中似乎是\token_to_str:c
),我建议您这样做:
\ExplSyntaxOn
\cs_new_eq:NN \TokenToStrC \token_to_str:c
\ExplSyntaxOff
并且使用更加方便\TokenToStrC
。
最后一点,你使用的\token_to_str:c #1
并没有按照你的想法去做。 \token_to_str:c {something}
相当于\token_to_str:N \something
相当于\string \something
。问题是你没有在参数周围使用括号,所以这样\token_to_str:c something
做\token_to_str:N \s omething
只是发生产生与正确版本相同的排版输出,但其底层做的事情却非常不同。