如何使用 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包和tabularx. arrayundefines\@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}

相關內容