
我正在動態建立命令,並希望根據迭代列表中的當前值來定義它們。問題在於當前值顯示為迭代變數的最後一個值。
這是一個 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}