我想创建一个\todo
命令和环境,其行为会根据我是否定义命令而改变\showtodos
。基本\todo
命令很容易编写:
\ifthenelse{\isundefined{\showtodos}}{
\newcommand{\todo}[1]{}
}{
\newcommand{\todo}[1]{#1}
}
本质上,我想隐藏\todo
命令的内容,除非\showtodos
已定义。我的问题是如何编写一个执行相同操作的环境?
答案1
有相当多的软件包可以满足您的要求,评论中已经提到过。
但是,如果您想要自己的解决方案,您可以利用包comment
中的环境verbatim
来发挥自己的优势。
下面的解决方案定义了一个todo
环境,只有\showtodos
定义了它才会显示其内容;否则它会将\begin{comment}
和\end{comment}
放在环境周围。
\documentclass{article}
\usepackage{verbatim} % for the comment environment
\usepackage{ifthen}
\usepackage{lipsum}
% if you want to see the todo
\newcommand{\showtodos}{show them} % comment this line if you don't
% want to see todo environment
% the todo environment
\newenvironment{todo}%
{%
\ifthenelse{\isundefined{\showtodos}}%
{\expandafter\comment}%
{}%
}%
{%
\ifthenelse{\isundefined{\showtodos}}%
{\expandafter\endcomment}%
{}%
}
\begin{document}
Outside of the the `todo' environment
\begin{todo}
Here we are in the `todo' environment.
\end{todo}
\end{document}
答案2
这是一个使用的基本示例\@ifundefined
:
\documentclass{article}
\makeatletter
\newcommand{\todo}{%
\@ifundefined{showtodo}{\relax}{%
This is stuff to do.%
}%
}
\makeatother
\begin{document}
1 \todo \par
2 \newcommand{\showtodo}{} \todo
\end{document}
\newif
下面是使用传统语句作为替代的基本示例:
\documentclass{article}
\newif\ifshowtodocmd \showtodocmdfalse
\newcommand{\showtodo}{\showtodocmdtrue}
\newcommand{\todo}{%
\ifshowtodocmd
This is stuff to do.%
\fi}
\begin{document}
1 \todo \par
2 \showtodo \todo
\end{document}
同样的方法也适用于环境。etoolbox
包裹还提供了一组非常丰富的宏来测试其他宏或其他条件命令的存在。
有关命令存在的参考,请阅读 TeX FAQ 条目这个命令定义了吗?
答案3
最后,你还是得在某处指定是否启用或禁用待办事项,对我来说,像 \enabletodos 这样的命令有点不自然。你可以使用类似
\newcommand\printTodo[1]{I still have to do #1}
\newcommand\todo[1]{\printTodo{#1}}
如果你想禁用 \todo,只需将第二行替换为
\newcommand\todo[1]{}
这会使您的“如何打印待办事项”命令保持不变,并且基本上相当于不指定 \showtodos。另外,您可以在任何地方重新定义待办事项命令,因此您可以轻松地在整个文档中切换行为。