我正在创建一份讲义,其中有一个命令可以隐藏学生的答案并显示教师的答案。我定义了一个invisible
接受布尔值和文本的新命令。如果是0
,文本应该保持不变。如果是1
,文本应该以白色打印,使其在纸上不可见。但是在这个例子中,无论布尔值如何,文本都会被打印。我创建了另一个命令,altinvisible
其中文本不是参数。它没有解决问题。这里有什么问题?
\documentclass{article}
\usepackage{tikz}
\newcommand{\invisible}[2]{\ifcase#1\or\expandafter\textcolor{white}\fi{#2}}
\newcommand{\altinvisible}[1]{\ifcase#1\or\expandafter\textcolor{white}\fi}
\title{}
\author{}
\begin{document}
{3.14}
\textcolor{white}{3.14}
\invisible{0}{3.14}
\invisible{1}{3.14}
\altinvisible{0}{3.14}
\altinvisible{1}{3.14}
\end{document}
答案1
如果您不完全了解 TeX 的宏和原语(例如\expandafter
本例)的工作原理,我建议编写不使用它们的易于理解的宏(请参阅\invisible
我的答案中的修改后的宏)(可能以编译速度稍慢为代价)。
如果您想学习,有几种方法。请参阅\altinvisible
下面\altbinvisible
的宏。
学习资料:
- \@firstoftwo 和 \@secondoftwo 起什么作用?
- TeXbook/TeX 按主题 (阅读
\expandafter
) - https://www.overleaf.com/learn/latex/Articles/How_does_%5Cexpandafter_work%3A_An_introduction_to_TeX_tokens
- 我应该从哪里开始 LaTeX 编程?
tl;dr 在这种情况下,错误在于您可以清楚地看到,如果和之间有多个标记,则\expandafter
不能用于早期执行。\fi
\expandafter
\fi
\documentclass{article}
\usepackage{tikz}
\newcommand{\textcolorwhite}{\textcolor{white}}
\newcommand{\invisible}[2]{\ifcase#1 #2\or\textcolor{white}{#2}\fi}
\newcommand{\altinvisible}[1]{\ifcase#1\or\expandafter\textcolorwhite\fi}
\makeatletter
\newcommand{\altbinvisible}[1]{\ifcase#1\or\expandafter\@gobble\fi}
\makeatother
\title{}
\author{}
\begin{document}
visible: {3.14}
invisible: \textcolor{white}{3.14}
visible: \invisible{0}{3.14}
invisible: \invisible{1}{3.14}
visible: \altinvisible{0}{3.14}
visible: \altbinvisible{0}{3.14}
invisible: \altinvisible{1}{3.14}
invisible: \altbinvisible{1}{3.14}
\end{document}