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