Wie definiere ich den Befehl \\ in einer Tabelle mit expl3 neu?

Wie definiere ich den Befehl \\ in einer Tabelle mit expl3 neu?

Wenn ich versuche, \\innerhalb einer Tabelle neu zu definieren, funktioniert die Neudefinition nicht. Ich habe verstanden, dass \AtBeginEnvironmentmein \\Befehl wahrscheinlich nach dem Hook neu definiert wird, aber ich weiß nicht, wie ich das beheben kann. Helfen Sie mir bitte, wie ich innerhalb einer Tabelle neu definieren kann \\. Vielen Dank an alle für jede Hilfe.

\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}

Antwort1

Es ist schwer...

Nun, das Neudefinieren ist eigentlich der einfache Teil: Ihr Code hat nicht funktioniert, weil eine der ersten Dinge, die die tabularUmgebung tut, ist \let \\=\@tabularcr, also ist Ihre Neudefinition weg. Sie müssen \@tabularcrstattdessen neu definieren. Denken Sie auch daran, dass \\ein optionales Argument hat, also müssen Sie auch damit klarkommen. Und da es \@tabularcrsich um den eigentlichen Befehl handelt, den Sie wollen, können Sie ihn nur einmal neu definieren, anstatt in jeder Umgebung.

Der schwierige Teil ist \@tabularcr, dass TeX nach beginnt \omit, nach zu suchen. Wenn Sie das also \messagean dieser Stelle tun, brechen Sie vollständig ab \multicolumn. Sie müssen entweder das ausführen \message(oder was auch immer Sie hier tun möchten).Vordas Original \@tabularcroder innen \noalign.

arraySie möchten wahrscheinlich auch das Paket und berücksichtigen tabularx. arrayundefiniert \@tabularcrund verwendet nur \@arraycr, also müssen Sie dies überprüfen. Die Neudefinition hängt davon ab, ob sie vor oder nach dem Laden des Pakets erfolgt, also habe ich sie \AtBeginDocumentzur Sicherheit eingefügt.


Das Generikum \kozlovskiy_tabular_cr:Nnnakzeptiert drei Argumente:

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

dann tut es

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

Diese Zeile xerweitert alles:

  • \exp_not:Nverhindert die Ausbreitung von<cr command>
  • \IfValueT {#2} { * }erweitert sich zu *oder nichts, abhängig davon, ob es ein *Argument gab
  • \IfValueT {#3} { [{#3}] }wird erweitert zu [#3]oder zu nichts, abhängig davon, ob ein optionales Argument vorhanden war

und werden schließlich:

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

Beachten Sie auch, dass tabularxder Umgebungstext mehrmals ausgeführt wird. Sie können daher stattdessen Folgendes verwenden:

\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}

verwandte Informationen