在单个 \newenvironment 中使用更多 \newcommand,并计算 \newenvironment 实例数

在单个 \newenvironment 中使用更多 \newcommand,并计算 \newenvironment 实例数

我正在尝试用 LaTeX 编写一个类(这是我的第一个类)来管理锦标赛中的一些球队,但我遇到了一些与\newenvironment和相关的问题\newcommand。例如,我希望有一些可以在任何时候显示的“全局”变量,以及一些只能在特定环境中查看的“本地”变量。我遇到的第一个问题是,当定义了\newenvironment多个参数时,我不知道如何将参数的数量传递给\newcommand。我试过用谷歌搜索,但没有找到任何答案。

还有一些其他问题,我想我以后会遇到。例如,每次我实例化这样一个新环境时,我希望计数器会随着实例的增加而增加(也许我可以用 轻松实现\newcounter,但现在我被困在前面提到的点上)。最后,如果我可以将颜色作为参数传递给 ,那就太好了,\newenvironment我可以在命令中使用它\colorbox{}来为每个团队显示漂亮的颜色。但这些都是我以后可能会解决的问题。现在,为了更清楚,这是我编写的尝试代码,但我无法让它工作:

% Copied from internet
\let\@CUP\relax
\def\CUP#1{\def\@CUP{Tournament #1}}
%


\newenvironment{team}[3]{
    \@CUP
    \newcommand{\playerone}[1]{This is the first player: #1}
    \newcommand{\playertwo}[1]{This is the second player: #1}
    \newcommand{\playerthree}[1]{This is the third player: #1}
}{}



% Main document

\begin{document}

CUP{Champions}

\begin{team}
        \playerone{John} \\
        \playertwo{Carl} \\
        \playerthree{Smith}
\end{team}

\begin{team}
        \playerone{Scott} \\
        \playertwo{Luke} \\
        \playerthree{Danny}
\end{team}

% Some counter goes somewhere.

\end{document}

答案1

关于嵌套定义,最重要的是要正确获取 s 的数量#:在\newenvironment的第一部分中,#1#2#3引用您传递的三个参数。在内部 的定义中\newcommand,使用 ##1 引用您正在定义的命令中的参数,并仍然使用#1#2#3引用环境的参数。如果您\newcommand的 内部有一个\newcommand,它的参数将是####1####2,等等,我建议您更改结构以保持您的理智 ;)

答案2

目前并不完全清楚您要做什么,但这里有一个针对您的代码的设置,它将编译并产生一些输出。

示例输出

主文件:

\documentclass{myclass}

% Main document

\begin{document}

\tracingmacros=1

\CUP{Champions}

\begin{team}{a}{b}{c}
  \playerone{John} 

  \playertwo{Carl} 

  \playerthree{Smith}
\end{team}

\begin{team}{p}{q}{r}
  \playerone{Scott} 

  \playertwo{Luke} 

  \playerthree{Danny}
\end{team}

\end{document}

myclass.cls

\LoadClassWithOptions{article}

\let\@CUP\relax
\def\CUP#1{\def\@CUP{Tournament #1}}

\newenvironment{team}[3]{
\begin{center}
  \@CUP
\end{center}
    Argument 1 is #1; argument 2 is #2; argument 3 is #3 \par
    \newcommand{\playerone}[1]{This is the first player: ##1}
    \newcommand{\playertwo}[1]{This is the second player: ##1}
    \newcommand{\playerthree}[1]{This is the third player: ##1}
}{}

类文件需要设置字体等。最简单的方法是基于现有的类文件进行构建,在本例中article为 。请参阅clsguide有关编写类以及特别是在其中加载类和包的信息。

现在您的环境team需要三个参数。主文档中的代码没有提供任何参数。我在第一次调用中将它们称为ab和。在环境中,c它们可以引用为#1#2和。#3

正如 Ulrich Schwarz 所说,如果您希望在环境中定义命令,那么它的参数将被引用为##1等。通常,将它们作为全局命令要简单得多。如果您希望限制它们的使用/提供适当的错误或警告消息,Latex 以及etoolbox包提供了您在其中使用的各种测试命令。查看标准类的来源以获得一些灵感。

相关内容