想象一下以下情况:一所学校提供两门课程,课程 A 和课程 B。其中一门课程是数学,另一门课程是物理。数学由 Bill 教授,物理由 Susan 教授。我想使用 ifthen 包实现这些关联,因此我尝试了以下方法:
\documentclass{article}
\usepackage{ifthen}
\newcommand{\course}[1]{
\ifthenelse{\equal{#1}{A}}{math}{}%
\ifthenelse{\equal{#1}{B}}{physics}{}%
}
\newcommand{\teacher}[1]{
\ifthenelse{\equal{\course{#1}}{math}}{Bill}{}%
\ifthenelse{\equal{\course{#1}}{physics}}{Susan}{}%
}
\begin{document}
Course: \course{A}
Teacher: \teacher{A}
\end{document}
这会产生大量错误。那么 if/then 无法处理新命令吗?有什么方法可以实现吗?
答案1
有很多方法可以做到这一点。下面是使用单个原始方法\if
(因为您只有两道菜)的方法:
课程:数学
老师:Bill
\documentclass{article}
\newcommand{\course}{%
\ifmathcourse
math%
\else% not mathcourse
physics%
\fi
}
\newcommand{\teacher}{%
\ifmathcourse
Bill%
\else% not mathcourse
Susan%
\fi
}
\newif\ifmathcourse% default is \mathcoursefalse
\setlength{\parindent}{0pt}% Just for this example
\begin{document}
\mathcoursetrue% This is a math course
Course: \course \par
Teacher: \teacher
\end{document}
也许,对于多个课程,你可以根据其姓名和老师一些ID。下面,\setcourse{<course>}{<name>}{<teacher>}
设置这个,同时\coursename
提取\courseteacher
该内容。
课程:数学
老师:Bill
课程:物理
老师:Susan
\documentclass{article}
\newcommand{\currentcourse}{}
\newcommand{\course}[1]{\renewcommand{\currentcourse}{#1}}
\makeatletter
\newcommand{\coursename}{\@nameuse{course@\currentcourse @name}}
\newcommand{\courseteacher}{\@nameuse{course@\currentcourse @teacher}}
% \setcourse{<course>}{<name>}{<teacher}
\newcommand{\setcourse}[3]{%
\@namedef{course@#1@name}{#2}%
\@namedef{course@#1@teacher}{#3}%
}
\makeatother
\setcourse{math}{Mathematics}{Bill}
\setcourse{physics}{Physics}{Susan}
\setlength{\parindent}{0pt}% Just for this example
\begin{document}
\course{math}
Course: \coursename \par
Teacher: \courseteacher
\course{physics}
Course: \coursename \par
Teacher: \courseteacher
\end{document}
如果需要的话,可以建立错误检查。