LaTeX 命令或环境用于从几个给定选项中选择性地打印一个

LaTeX 命令或环境用于从几个给定选项中选择性地打印一个

我目前正在浪费时间尝试创建一个概念验证课程,以展示使用 LaTeX 而不是 MS Word 编写我们大学的课程会有一些好处。由于这些课程本质上是法律文件,因此已经存在一个模板,其中包含一些固定措辞、一些可供选择的选项以及一些用于插入特定于该学习计划的材料的空间(例如必修课程表)。我的想法是提供指定注释的命令(仅在草稿模式下显示)、要替换的示例(否则在最终模式下会抛出错误,因此它们不会被忽略)等等。其中大部分我可能可以自己弄清楚,但对于其中一件事,我还没有足够的经验:我想要一个具有以下属性的命令或环境/列表。

  • 接受可变数量的参数或项目(最多 4 个),内容任意(通常是一个句子或一段,有时也是一个长表或类似的东西)
  • 在草稿模式下打印出所有参数/项目
  • 在最终模式下会引发错误,除非选择了给定的选项之一(通过命令/环境的可选参数)

如果尚未有适用于此的软件包,我愿意接受定制解决方案或建议,以通过其他方式实现相同的功能。

编辑:这是此类命令和环境的一个例子:

\choose[3]{Option A}{Option B}{Option C}
% in draft mode prints: Option A / Option B / Option C
% in final mode throws an error
\choose[2][3]{Option A}{Option B}{Option C}
% in either mode prints: Option B

\begin{select}
\item Paragraph A
\item Paragraph B
% ...
\item Paragraph Z
\end{select}
% in draft mode prints all paragraphs (with some separator in between)
% in final mode throws an error

\begin{select}[2]
\item Paragraph A
\item Paragraph B
% ...
\item Paragraph Z
\end{select}
% in either mode prints Paragraph B

答案1

例如\mychoose宏可以这样定义:

\newcount\optnum
\newif\ifdraftmode  \let\finalmodetrue=\draftmodefalse \let\finalmodefalse=\draftmodetrue

\def\mychoose[#1]{\bgroup\def\optcount{#1}\futurelet\next\mychooseA}
\def\mychooseA{\ifx\next[\def\next{\mychooseB}\else \def\next{\mychooseB[0]}\fi \next}
\def\mychooseB[#1]{%
   \ifdraftmode \ifnum#1>0 \draftmodefalse \fi\fi
   \ifdraftmode\else
      \ifnum#1=0 
         \errmessage{\string\mychoose: no parameter specified in final mode}%
         \def\realopt{0}%
      \else \let\realopt=\optcount \def\optcount{#1}\fi
   \fi 
   \optnum=0 \mychooseC
}
\def\mychooseC#1{\advance\optnum by1 \def\tmp{#1}%
   \ifdraftmode\tmp\else \ifnum\realopt=\optnum\tmp \fi\fi
   \ifnum\optcount>\optnum \expandafter\mychooseC \else \egroup\fi
}

%% test:
\finalmodefalse
\mychoose[3]{Option A}{Option B}{Option C}

\finalmodetrue
\mychoose[2][3]{Option A}{Option B}{Option C}

环境{select}可以定义如下:

\newcount\optnum
\newif\ifdraftmode  \let\finalmodetrue=\draftmodefalse \let\finalmodefalse=\draftmodetrue

\def\selectB{\futurelet\next\selectC}
\def\selectC{\ifx\next[\def\next{\selectD}\else \def\next{\selectD[0]}\fi \next}
\def\selectD[#1]{\def\realopt{#1}%
   \ifdraftmode\else \ifnum#1=0 
      \errmessage{{select}: no parameter specified in final mode}\fi\fi
   \ifnum#1=0 \else \draftmodefalse \fi
   \par \optnum=0
   \def\item{\par\egroup \advance\optnum by1
             \ifdraftmode\else \ifnum\realopt=\optnum \else \setbox0=\vbox \fi\fi
             \bgroup}
   \bgroup
}
\def\selectE{\par\egroup}
\newenvironment{select}\selectB\selectE

%% test:
\finalmodefalse
\begin{select}
\item Paragraph A
\item Paragraph B
\item Paragraph Z
\end{select}

\finalmodetrue
\begin{select}[2]
\item Paragraph A
\item Paragraph B
\item Paragraph Z
\end{select}

但我怀疑你是否选择了最佳策略。

相关内容