동적 명령 생성을 위해 루프의 이전 요소를 중간 변수에 저장합니다.

동적 명령 생성을 위해 루프의 이전 요소를 중간 변수에 저장합니다.

동적으로 명령을 생성 중이며 반복 목록의 현재 값을 기반으로 명령을 정의하고 싶습니다. 문제는 현재 값이 반복 변수의 마지막 값으로 나타난다는 것입니다.

여기 MWE가 있습니다. 이 예제는 분명히 의미가 없지만 제가 생각할 수 있는 응용 프로그램은 루프의 마지막 값을 기억하는 것입니다. \expandafter, , 의 다양한 변형을 시도했지만 \edef이해할 수 없습니다. 확장에 대해 읽어보았습니다. 일부 중간 변수를 정의하고 "1:1, 2:2"가 표시되도록 생성한 명령에 이를 푸시하고 싶습니다.

여기에 이미지 설명을 입력하세요

\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\begin{document}%
    \noindent%
    \newcounter{n}%
    \setcounter{n}{0}%
    \renewcommand{\do}[1]{%
        \let\Num#1%
        \setcounter{n}{#1}%
        \expandafter\newcommand\csname C\alph{n}\endcsname{\textbf{#1}: \Num}% create a command
    }%
    \docsvlist{1,2,3,4}%
\Ca\\
\Cb\\
\end{document}

편집하다:

다음은 좀 더 예시적인 예입니다. 루프에서 현재 번호와 이전 번호를 표시하는 명령을 정의하고 싶지만 이전 번호는 항상 목록의 마지막 번호입니다.

여기에 이미지 설명을 입력하세요

\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\usepackage{xintexpr}
\begin{document}%
    \noindent%
    \newcounter{n}%
    \setcounter{n}{0}%
    \renewcommand{\do}[1]{%
        \edef\evenodd{\xintthe\xintiexpr\value{n}/:2\relax}% get the column num
        \ifnum\evenodd=0%
            \let\PrevNum#1%
        \fi
        \ifnum\evenodd=1%
            \expandafter\newcommand\csname C\alph{n}\endcsname{prev: \PrevNum, current: #1}% create a command
        \fi
        \setcounter{n}{#1}%
    }%
    \docsvlist{1,2,3,4,5,6}%
\Ca\\
\Cc\\
\Ce\\
\end{document}

답변1

최종 목표가 무엇인지는 확실하지 않습니다. 그러나 은 \let올바른 도구가 아니므로 를 사용해야 합니다 \def. 또한 \PrevNum제어 시퀀스가 ​​아닌 확장에 액세스해야 합니다 .

\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\usepackage{xintexpr}

\newcounter{n}
%\setcounter{n}{0}%
\renewcommand{\do}[1]{%
  \edef\evenodd{\xintthe\xintiexpr\value{n}/:2\relax}% get the column num
  \ifnum\evenodd=0
    \def\PrevNum{#1}%
  \fi
  \ifnum\evenodd=1
    \definetablecommand{C\alph{n}}{#1}{\PrevNum}%
  \fi
\setcounter{n}{#1}%
}
\newcommand{\definetablecommand}[3]{%
  \expandafter\definetablecommandaux\expandafter{#3}{#1}{#2}%
}
\newcommand{\definetablecommandaux}[3]{%
  \expandafter\newcommand\csname #2\endcsname{prev: #1, current #3}%
}

\docsvlist{1,2,3,4,5,6}

\begin{document}

\Ca

\Cc

\Ce

\end{document}

%after 상수가 잘못되어 예상치 못한 결과가 발생할 수 있다는 점에 유의하세요 .

내부에서 그런 짓을 하는 것도 document논란의 여지가 있다.

여기에 이미지 설명을 입력하세요

다른 프로그래밍 스타일을 사용합니다.

\documentclass[11pt,a4paper]{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\definetablecommands}{m}
 {
  \ilikethevegetable_dtc_main:n { #1 }
 }

\seq_new:N \l__ilikethevegetables_dtc_data_seq
\tl_new:N \l__ilikethevegetables_dtc_item_tl

\cs_new_protected:Nn \ilikethevegetable_dtc_main:n
 {
  \seq_set_from_clist:Nn \l__ilikethevegetables_dtc_data_seq { #1 }
  \seq_map_indexed_inline:Nn \l__ilikethevegetables_dtc_data_seq
   {% ##1 is the current item index, ##2 is the current item
    \int_if_odd:nTF { ##1 }
     {% remember the item
      \tl_set:Nn \l__ilikethevegetables_dtc_item_tl { ##2 }
     }
     {% define the control sequence
      \cs_new:cpx { C \int_to_alph:n { ##1 - 1 } }
       {
        \exp_not:n { prev:~} \exp_not:V \l__ilikethevegetables_dtc_item_tl ,~
        \exp_not:n { current:~ ##2 }
       }
     }
   }
 }

\ExplSyntaxOff

\definetablecommands{1,2,3,4,5,6}

\begin{document}

\Ca

\Cc

\Ce

\end{document}

관련 정보