您知道使用当前计数器值来调用宏中的参数的简单方法吗?
在 myPackage 中我有这个
注意:我将 for 循环定义为
% \forloop[step]{counter}{initial_value}{conditional}{code_block}
问题出在下面的代码中
\newcounter{foo}
\newenvironment{myEnvironment}[1]{
\newcommand{\myLocalMacro}[#1]{% number of arguments depends on the value inserted in myEnvironment (this works fine)
\forloop[1]{foo}{1}{\numexpr\value{foo}-1<#1}{
##\value{foo} % HERE I need to return ##1 if foo is 1, ##2 if foo is 2 etc. (this doesn't work)
- % some separator
}%end forloop
}%end myLocalMacro
}
{}%end myEnvironment
我测试了可变数量的参数\myLocalMacro
并且它可以工作。
我还测试了参数的嵌套-在 for 循环中\forloop
写入##1
等会给出第一个值和第二个值。现在我需要它依赖于计数器。##2
foo
主文档如下所示
\documentclass{article}
\usepackage{myPackage}
\begin{document}
\begin{myEnvironment}{7}
\myLocalMacro{F}{O}{O}{B}{A}{R}{1} % this separation into arguments will be written manually
\myLocalMacro{F}{O}{O}{B}{A}{R}{2}
\myLocalMacro{F}{O}{O}{B}{A}{R}{3}
\end{myEnvironment}
or
\begin{myEnvironment}{3}
\myLocalMacro{T}{e}{X}
\myLocalMacro{a}{b}{c}
\end{myEnvironment}
\end{document}
预期输出应如下所示
F - O - O - B - A - R - 1 -
F - O - O - B - A - R - 2 -
F - O - O - B - A - R - 3 -
或者
T - e - X -
a - b - c -
好吧,这只是一个例子,真正的格式化会更复杂,这就是为什么我为它定义了一个环境而不是为每个字符手动执行此操作。
谢谢。
答案1
你提出的定义无法工作,因为 TeX 不会对宏的替换文本中的标记进行扩展,并且#1
必须文字:不能将其指定为#\value{counter}
。有一些技巧可以实现这一点,但我认为它们对您的情况没有帮助。
以下可能就是您正在寻找的内容:
\documentclass{article}
\makeatletter
\newenvironment{myEnvironment}[1]
{\let\myEnv@Temp#1\relax}
{}
\newcommand\myLocalMacro[1]{%
\@tfor\next:=#1\do{\expandafter\myEnv@Temp\expandafter{\next}}%
}
\makeatother
\newcommand{\addhyphen}[1]{#1 - }
\newcommand{\addcomma}[1]{#1, }
\begin{document}
\begin{myEnvironment}{\addhyphen}
\myLocalMacro{FOOBAR1}\par
\myLocalMacro{FOOBAR2}\par
\myLocalMacro{FOOBAR3}\par
\end{myEnvironment}
\begin{myEnvironment}{\addcomma}
\myLocalMacro{TeX}\par
\myLocalMacro{abc}\par
\end{myEnvironment}
\end{document}
的参数myEnvironment
是格式化宏,它应用于的参数中的每个标记\myLocalMacro
。
不需要定义辅助宏的不同实现:
\documentclass{article}
\makeatletter
\newenvironment{myEnvironment}[1]
{\renewcommand\myEnv@Temp[1]{#1}}
{}
\newcommand\myEnv@Temp{} % initialize
\newcommand\myLocalMacro[1]{%
\@tfor\next:=#1\do{\expandafter\myEnv@Temp\expandafter{\next}}%
}
\makeatother
\begin{document}
\begin{myEnvironment}{#1 - }
\myLocalMacro{FOOBAR1}\par
\myLocalMacro{FOOBAR2}\par
\myLocalMacro{FOOBAR3}\par
\end{myEnvironment}
\begin{myEnvironment}{#1, }
\myLocalMacro{TeX}\par
\myLocalMacro{abc}\par
\end{myEnvironment}
\end{document}
参数myEnvironment
是您想要应用于每个标记的格式。
如果您想保留空格,则需要一种更复杂的方法;这是一种简单的方法expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment{myEnvironment}{m}
{
\cs_set:Nn \pavlik_myenv_temp:n { #1 }
}
{
}
\NewDocumentCommand\myLocalMacro{m}
{
\pavlik_myenv_local:n { #1 }
}
\tl_new:N \l__pavlik_myenv_items_tl
\cs_new_protected:Nn \pavlik_myenv_local:n
{
\tl_set:Nn \l__pavlik_myenv_items_tl { #1 }
\tl_replace_all:Nnn \l__pavlik_myenv_items_tl { ~ } { \c_space_tl } % preserve spaces
\tl_map_inline:Nn \l__pavlik_myenv_items_tl
{
\pavlik_myenv_temp:n { ##1 }
}
}
\ExplSyntaxOff
\begin{document}
\begin{myEnvironment}{#1 - }
\myLocalMacro{FOO BAR1}\par
\myLocalMacro{FOOBAR2}\par
\myLocalMacro{FOOBAR3}\par
\end{myEnvironment}
\begin{myEnvironment}{#1, }
\myLocalMacro{TeX}\par
\myLocalMacro{abc}\par
\end{myEnvironment}
\end{document}
这\tl_map_inline:Nn
是 的类似物\@tfor
;在应用它之前,我们将参数中的所有空格更改为\c_space_tl
,其展开式是一个空格。