索赔地点为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
。如果我没记错的话,手册中有关于此内容的说明。
我希望我的空间论点是正确的,否则请丢弃它。