如何使用 expl3 重新定义表格内的 \\ 命令?

如何使用 expl3 重新定义表格内的 \\ 命令?

当我尝试\\在表格中重新定义时,我的重新定义不起作用。我明白,在钩住\AtBeginEnvironment某些东西后可能会重新定义我的\\命令,但我不知道如何修复它。请帮助我,如何\\在表格中重新定义。感谢大家的帮助。

\documentclass{article}
\usepackage{expl3,etoolbox}
\ExplSyntaxOn
\AtBeginEnvironment{tabular}{
\cs_set_eq:Nc \\ {orig_endofline}
\cs_gset_protected:Npn \\ {
\orig_endofline
\message{new_line}
}
}
\ExplSyntaxOff
\author{Alexandr Kozlovskiy}
\title{test}
\begin{document}
\maketitle{}
\begin{tabular}{cc}
a&b\\
\end{tabular}
\end{document}

答案1

这个很难(硬...

好吧,重新定义其实是最简单的部分:您的代码无法工作,因为环境tabular所做的第一件事就是\let \\=\@tabularcr,所以您的重新定义已经消失。您必须重新定义\@tabularcr。还要记住\\有一个可选参数,因此您也必须处理它。而且由于 是\@tabularcr您想要的实际命令,因此您只需重新定义一次,而不必在每个环境中都重新定义它。

困难的部分是\@tabularcr,之后 TeX 开始扫描\omit,所以如果你\message在此时这样做,你就完全崩溃了\multicolumn。你必须发出\message(或者你打算在这里做什么)原来 的\@tabularcr, 或者 里面 的\noalign.

您可能还想考虑array包和tabularxarray未定义\@tabularcr且仅使用\@arraycr,因此您必须检查这一点。重新定义将取决于它是在包加载之前还是之后发生,因此我将其放在这里\AtBeginDocument以确保万无一失。


泛型\kozlovskiy_tabular_cr:Nnn有三个参数:

\kozlovskiy_tabular_cr:Nnn <cr command> <star arg> <opt arg>

那么它

\use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }

该行将x扩展所有内容:

  • \exp_not:N阻止扩张<cr command>
  • \IfValueT {#2} { * }扩展为*或不扩展,取决于是否存在*参数
  • \IfValueT {#3} { [{#3}] }扩展为[#3]或不扩展,取决于是否有可选参数

最后变成:

<cr command> <star arg (if present)> <opt arg (if present)>

还要注意,tabularx将多次执行环境主体,因此您可能需要:

\cs_new_protected:Npn \kozlovskiy_tabular_cr:Nnn #1 #2 #3
  {
    \use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
    \token_if_eq_meaning:NNF \@footnotetext \TX@trial@ftn
      { \noalign { \message{<<<<new_line>>>>} } }
  }

\documentclass{article}
\usepackage{expl3,xparse}
\usepackage{array,tabularx,colortbl}
\ExplSyntaxOn
\makeatletter
\cs_new_protected:Npn \kozlovskiy_tabular_cr:Nnn #1 #2 #3
  {
    % \message{new_line} % before or
    \use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
    \noalign { \message{<<<<new_line>>>>} } % after in \noalign
    %
    % \message{new_line} % this breaks \multicolumn
  }
\AtBeginDocument
  {
    \@ifpackageloaded{array}{ }
      {
        \cs_new_eq:NN \LTX@tabularcr \@tabularcr
        \RenewDocumentCommand \@tabularcr { s o }
          { \kozlovskiy_tabular_cr:Nnn \LTX@tabularcr {#1} {#2} }
      }
    \cs_new_eq:NN \LTX@arraycr \@arraycr
    \RenewDocumentCommand \@arraycr { s o }
      { \kozlovskiy_tabular_cr:Nnn \LTX@arraycr {#1} {#2} }
  }
\ExplSyntaxOff
\author{Alexandr Kozlovskiy}
\title{test}
\begin{document}
\maketitle{}
\begin{tabular}{cc}
a&b\\
\multicolumn{2}{c}{c and d}\\
\end{tabular}
\begin{tabularx}{2cm}{Xc}
a&b\\
\multicolumn{2}{c}{c and d}\\
\end{tabularx}
\end{document}

相关内容