我试图让某些东西在给出参数时出现条件。
我希望在文档的开头填写两条数据
% Pre or Post epoxy?
\epoxy{pre}
% Checklist ID number
\idnum{123456}
然后让它们以这种形式出现
(\@epoxy-epoxy -- \@idnum)
如果有的话,在文档的各个位置,如果没有,则让该行完全空白
我已经像这样设置了课程文件
\def\epoxy#1{\gdef\@epoxy{#1}}
\def\idnum#1{\gdef\@idnum{#1}}
我想将文档标题定义为
\AtBeginDocument {\listtitle \newline (\@epoxy-epoxy -- \@idnum) \newline \header \begin{checklist}}
或者
\AtBeginDocument {\listtitle \newline \newline \header \begin{checklist}}
取决于是否给出了 idnum 和 epic 参数
有什么办法可以做到这一点吗?
答案1
初始化\@epoxy
并\@idnum
固定某个值;然后定义一个\@print@epoxy@idnum
宏:
\let\@epoxy\hfuzz % initialize
\let\@idnum\vfuzz % initialize
\def\epoxy#1{\gdef\@epoxy{#1}}
\def\idnum#1{\gdef\@idnum{#1}}
\def\@print@epoxy@idnum{%
\ifx\@epoxy\hfuzz
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{\ifx\@idnum\vfuzz
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\mbox{}}{(\@epoxy--epoxy -- \@idnum)}%
}%
}
答案2
您不必使用条件,只需安排内部宏不产生任何内容,除非使用了两个命令。因此,此处版本 1-3 产生一个空白行,但版本 4 和 5 显示两个术语。
\documentclass{article}
\def\inittitle{%
\def\stuff{\mbox{}}%
\def\xidnum##1{}%
\def\epoxy##1{\def\stuff{\xidnum{##1-epoxy -- }}}%
\def\idnum##1{\def\xidnum####1{####1##1}}%
}
\setlength\parskip{20pt}
\begin{document}
\inittitle
1title \newline \stuff \newline zzz
\inittitle
\epoxy{pre}
2title \newline \stuff \newline zzz
\inittitle
\idnum{123456}
3title \newline \stuff \newline zzz
\inittitle
\epoxy{pre}
\idnum{123456}
4title \newline \stuff \newline zzz
\inittitle
\idnum{123456}
\epoxy{pre}
5title \newline \stuff \newline zzz
\end{document}
答案3
您可以为每个条件设置布尔条件,然后在分配时将它们设置为 true。如果您始终没有或同时有两者,则一个条件就足够了。这里将写入定义的条件。
\documentclass{article}
\newif\ifepoxy\epoxyfalse
\newif\ifidnum\idnumfalse
\makeatletter
\def\epoxy#1{\gdef\@epoxy{#1}\epoxytrue}
\def\idnum#1{\gdef\@idnum{#1}\idnumtrue}
\def\writeStuff{%
\ifepoxy
\@epoxy-epoxy
\fi
\ifidnum
-- \@idnum
\fi}
\makeatother
\begin{document}
Test1: \writeStuff
\epoxy{pre}
Test2: \writeStuff
\idnum{123456}
Test3: \writeStuff
\end{document}
编辑--简化
如果要测试命令是否已定义,可以使用\@ifundefined
。要单独测试定义,您可以简化我之前的回答:
\documentclass{article}
\makeatletter
\def\epoxy#1{\gdef\@epoxy{#1}}
\def\idnum#1{\gdef\@idnum{#1}}
\def\writeStuffII{%
\@ifundefined{@epoxy}{}{\@epoxy-epoxy}%
\@ifundefined{@idnum}{}{ -- \@idnum}
}
\makeatother
\begin{document}
如果应该将两者都定义为写入任何内容,则可以嵌套条件:
\def\writeStuffIII{%
\@ifundefined{@epoxy}{}{%
\@ifundefined{@idnum}{}{\@epoxy-epoxy -- \@idnum}}
}