我正在尝试用 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
需要三个参数。主文档中的代码没有提供任何参数。我在第一次调用中将它们称为a
、b
和。在环境中,c
它们可以引用为#1
、#2
和。#3
正如 Ulrich Schwarz 所说,如果您希望在环境中定义命令,那么它的参数将被引用为##1
等。通常,将它们作为全局命令要简单得多。如果您希望限制它们的使用/提供适当的错误或警告消息,Latex 以及etoolbox
包提供了您在其中使用的各种测试命令。查看标准类的来源以获得一些灵感。