使用 forloop 而不是 foreach 進行迭代

使用 forloop 而不是 foreach 進行迭代

我有這個{C/4/a/n,D/4/b/n,E/4/c/n}

這就是我用 foreach 迭代它的方式:

\foreach \x\y\w\z in {C/4/a/n,D/4/b/n,E/4/c/n} {
        \x - \y - \w - \z
    }

但我需要用forloop來做到這一點。重要的是能夠分開 x、y、w 和 z,並且不要使用必須安裝在背面的軟體包,例如 expl3 或類似的軟體包。

答案1

下面定義了一個函數來循環使用兩種不同模式的列表。第一個是一個簡單的逗號分隔值列表,並#1引用當前列表項目(這只是一個\clist_map_inline:n)。

第二種模式將子清單的分隔符號作為可選參數,如果給定了它,您可以使用 存取子成員#1{<n>},並使用 存取完整清單#2。整個事情無需團體即可完成(與 不同\foreach),所以我希望它對您有用。

\documentclass{article}

\ExplSyntaxOn
\int_new:N \g__arturo_nested_level_int
\NewDocumentCommand \ForEach { +o +m +m }
  {
    \IfNoValueTF {#1}
      { \clist_map_inline:nn {#2} {#3} }
      { \__arturo_foreach:nnn {#1} {#2} {#3} }
  }
\cs_new_protected:Npn \__arturo_foreach:nnn #1#2#3
  {
    \int_gincr:N \g__arturo_nested_level_int
    \__arturo_foreach_aux:ccnnn
      { __arturo_foreach_code_ \int_use:N \g__arturo_nested_level_int :nn }
      { l__arturo_foreach_items_ \int_use:N \g__arturo_nested_level_int _seq }
      {#1} {#2} {#3}
    \int_gdecr:N \g__arturo_nested_level_int
  }
\cs_new_protected:Npn \__arturo_foreach_aux:NNnnn #1#2#3#4#5
  {
    \cs_set:Npn #1 ##1 ##2 {#5}
    \seq_clear_new:N #2
    \clist_map_inline:nn {#4}
      {
        \seq_set_split:Nnn #2 {#3} {##1}
        #1 { \seq_item:Nn #2 } {##1}
      }
  }
\cs_generate_variant:Nn \__arturo_foreach_aux:NNnnn { cc }
\ExplSyntaxOff

\begin{document}
\ForEach{a,b,c,d}{#1\par}

\ForEach[/]{C/4/a/n,D/4/b/n,E/4/c/n}{#1{1} - #1{2} - #1{3} - #1{4} (from #2)\par}
\end{document}

在此輸入影像描述

答案2

這是一個 TeX 解決方案。我不明白你到底想做什麼,但你可以從這裡開始。

\bgroup
\def\for#1\endfor{\def\body{#1}\iterate}
\def\iterate{\body\let\next=\iterate\else\let\next=\relax\fi\next}
\newcount\n
\n=0
% Example usage
\for
   \advance\n by1
     \number\n,   
   \ifnum\n<30
\endfor
\egroup

\bye

遞歸和 if 語句使程式語言圖靈完備。

相關內容