Wenn ich versuche, \\
innerhalb einer Tabelle neu zu definieren, funktioniert die Neudefinition nicht. Ich habe verstanden, dass \AtBeginEnvironment
mein \\
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 tabular
Umgebung tut, ist \let \\=\@tabularcr
, also ist Ihre Neudefinition weg. Sie müssen \@tabularcr
stattdessen neu definieren. Denken Sie auch daran, dass \\
ein optionales Argument hat, also müssen Sie auch damit klarkommen. Und da es \@tabularcr
sich 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 \message
an 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 \@tabularcr
oder innen \noalign
.
array
Sie möchten wahrscheinlich auch das Paket und berücksichtigen tabularx
. array
undefiniert \@tabularcr
und 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 \AtBeginDocument
zur Sicherheit eingefügt.
Das Generikum \kozlovskiy_tabular_cr:Nnn
akzeptiert 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 x
erweitert alles:
\exp_not:N
verhindert 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 tabularx
der 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}