테이블 형식 내부를 재정의하려고 하면 \\
재정의가 작동하지 않습니다. 나는 아마도 후크 후에 \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
. array
정의를 해제 \@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}