PGF 的 \foreach 带有奇怪的列表

PGF 的 \foreach 带有奇怪的列表

索赔地点为pgffor:对 \foreach-list 中最后一项进行特殊处理下面的命令有效。但我无法让它工作。我错过了什么?

\newcount\nra
\foreach[count=\nx]\x in {1--,2--,...,10--}{%
  \advance\nra by1
  \ifnum\nra>2 \breakforeach\fi
  \texttt{\x (\the\nra)}\space
}

另外,请问我该如何让以下内容发挥作用\foreach

\def\amspace{\let\amspace\space}
\newcount\nra
\foreach\x in {1pt,2pt,...,10pt}{%
  \advance\nra by1\relax
  \ifnum\nra>2 \breakforeach\fi
  \amspace\texttt{\x (\the\nra)}%
}

编辑(2012/06/19)

这现在是一个社区问题:每个人都可以编辑它或在下面提供他/她的建议

我重新提出这个问题是因为我想征询用户的意见,对于\foreach省略列表(即要完成的列表)来说,以下哪种格式更合适。欢迎提出其他语法的建议。

\foreach目前支持相当奇怪的语法,该语法在 PGF-2.10 手册的第 505 页给出(就在标题为对的特殊处理):

{0\pi,0.5\pi,...\pi,3\pi}
{A_1,..._1,H_1}
{1--, 4-- ,...--, 10--}
{1pt, 4pt, ...pt, 10pt}

建议

对于不完整(省略)列表,用户应在循环列表后包含可选键值,如下所示。这将大大加快列表完成速度并降低错误识别的可能性。

目标列表:

{a,B,1,5,A^1,A^3,A^5,A^7,A^9}

\newforeach 的语法:

\newforeach [<conventional.keys>] \x in {a,B,1,5,...}[
  start = A^1,
  end = A^9,
  step = 2,
  coupler = ^,
  grow right, % increment right of <coupler>
  grow left, % increment left of <coupler>
  macro elements, % elements are macros
  ... more keys
]
{<loop.callback>}

<conventional.keys>将是常见的\foreach键/变量和一些新的键/变量。

元素为宏的示例:

\pgfmathsetmacro\start{<expr>}
\pgfmathsetmacro\stopp{<expr>}
{\start,...,\stopp}

提醒

\newforeach将适用于任意列表分隔符和子分隔符(包括活动列表分隔符),并将通过 删除计算的组范围\foreach。新的用户变量将包括

*parser = <value> (e.g., {,})
*subparser = <value> (e.g., /)
list is macro = <true> | <false> % the given list is a macro
terminator = <value> (e.g., {;}) % callback terminator
evaluate \x as \y using <formula>
count in \nr all \x satisfying <condition>
store in \cmd all \x satisfying <condition>
apply to all \x satisfying <condition> = <code>
apply to all \x in serial range [a,b] = <code>
at begin loop = <code>
at end loop = <code>

解析器上的星号 ( *) 表示“记住并随后使用这个解析器,直到我改变它”。

将引入一个新的布尔值\iflastitem,可以在不同的嵌套深度上独立切换。\currentitemnumber还将在所有嵌套深度上引入项目计数器(例如),而不会在嵌套深度之间发生冲突。循环还可以提前查看\nextitem。并且,如果循环因\breaknewforeach或用户插入的列表项(\listbreaker)过早终止,则当前嵌套深度的列表的其余部分将在 中可用\listremainder\newforeach循环也可以使用用户插入的列表项 暂停\listpauser

答案1

人们必须始终记住,\foreach处理在组内重复的标记列表,因此重新定义和分配必须是全局的:

\documentclass{article}
\usepackage{pgffor}
\begin{document}

\def\amspace{\global\let\amspace\space}
\newcount\nra
*\foreach\x in {1pt,2pt,...pt,10pt}{%
  \global\advance\nra by1\relax
  \amspace\texttt{\x (\the\nra)}%
  \ifnum\nra>2 \breakforeach\fi
}*
\end{document}

这避免了\amspace像 percusse 的答案中那样多次重新定义。

关于语法:你可以这样想

\foreach\x in {11,...,31}{...}

\foreach\x in {11,...1,31}{...}

在前一种情况下将执行 21 个循环,在后一种情况下仅执行 3 个循环。

答案2

对于第一个版本,虽然有点令人失望,但您需要pgfmath模块。但请注意,如果删除[count=\nx],也可以删除pgfmath依赖项。此外,Peter 评论说,--需要额外的内容。我猜,背后的动机是剥离非增加部分,然后从给定列表中评估初始、增量和最终数字。

\documentclass{article}
\usepackage{pgffor}
\begin{document}
\newcount\nra
\foreach\x in {1--,2--,...--,10--}{%
  \global\nra\numexpr\the\nra+1 %or \global\advance\nra by1
  \texttt{\x (\the\nra)}\space
    \ifnum\nra>2 \breakforeach\fi
}
\end{document}

对于第二个版本,类似地

\documentclass{article}
\usepackage{pgffor,pgfmath}
\def\amspace{}
\begin{document}
Some text\foreach\x[count=\xi]in{1pt,2pt,...pt,10pt}{%
         \amspace\texttt{\x(\xi)}%
         \gdef\amspace{\space}
         \ifnum\xi>2\unskip\breakforeach\fi
}continues.
\end{document}

\breakforeach命令不会终止该项目的剩余代码,但会阻止循环再次运行。因此,最好将其保留为 中的最后一行\foreach。如果我没记错的话,手册中有关于此内容的说明。

我希望我的空间论点是正确的,否则请丢弃它。

相关内容