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.

아마도 패키지 arraytabularx. 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}

관련 정보