为什么表格在 \ExplSyntaxOn...\ExplSyntaxOff 中不能正常工作?

为什么表格在 \ExplSyntaxOn...\ExplSyntaxOff 中不能正常工作?

我发现它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只是发生产生与正确版本相同的排版输出,但其底层做的事情却非常不同。

相关内容