我正在用 LaTeX 保存一份笔记文档,所以我希望待办事项列表作为文档的一部分(而不是边注,或者对文档要做什么的注释)。
我很想定义一组可以在 的编号列表\enumerate
或 的简单列表中很好地工作的新命令\itemize
,但目前我需要 2 个版本。以下是我目前拥有的:
\documentclass{article}
\usepackage{wasysym}
\newcommand{\todoitem}{\item[\Square]~}
\newcommand{\doneitem}{\item[\CheckedBox]~}
\newcommand{\notdoneitem}{\item[\XBox]~}
\newcommand{\todoItem}{\item \Square~}
\newcommand{\doneItem}{\item \CheckedBox~}
\begin{document}
Using \texttt{\textbackslash doneItem} (nice) and \texttt{\textbackslash todoitem} (not nice) in a \texttt{\textbackslash itemize}.
\begin{itemize}
\doneItem Code the input for the new variables
\todoitem Code the $y$-mapping
\item Code the averaging
\end{itemize}
Using \texttt{\textbackslash doneitem} (nice) and \texttt{\textbackslash todoItem} (not nice) in a \texttt{\textbackslash enumerate}.
\begin{enumerate}
\doneitem Code the input for the new variables
\todoItem Code the $y$-mapping
\item Code the averaging
\end{enumerate}
\end{document}
生成结果:
有没有办法\todoitem
在itemize
环境中执行与我的相同的操作,但我\todoItem
在里面\enumerate
?我可以/应该测试我所处的环境吗?
答案1
如果我理解了你的问题,你是想根据它们是在或环境中被调用来\doneitem
附加不同的含义。\todoitem
enumerate
itemize
可以通过将宏定义的代码移到环境“开始”阶段执行的代码中来实现,而不是在序言中赋予它们全局含义。最快的解决方法是使用序言中的以下代码:
\makeatletter
\g@addto@macro{\itemize}{
\def\notdoneitem{\item[\XBox]~}
\def\todoitem{\item \Square~}
\def\doneitem{\item[\CheckedBox]~}
}
\g@addto@macro{\enumerate}{
\def\todoitem{\item[\Square]~}
\def\doneitem{\item \CheckedBox~}
}
\makeatother
itemize
这将在每个环境的开头“注入”宏定义enumerate
。然而,这意味着这些宏在环境之外没有任何意义。
我使用\def
而不是来\newcommands
避免嵌套这些环境时出现重新定义错误。
答案2
让我们看看您的代码中的以下变化。(用法:with item
for itemize
,with Item
for enumerate
)。
\documentclass{article}
\usepackage{wasysym}
%\newcommand{\todoitem}[1]{\item \Square~#1}
\newcommand{\todoitem}{\item[\Square]~}
%\newcommand{\doneitem}[1]{\item \CheckedBox~#1}
\newcommand{\doneitem}{\item[\CheckedBox]~}
%\newcommand{\notdoneitem}[1]{\item \XBox~#1}
\newcommand{\notdoneitem}{\item[\XBox]~}
%\newcommand{\todoItem}[1]{\item[\Square]#1}
\newcommand{\todoItem}{\item \Square~}
%\newcommand{\doneItem}[1]{\item[\CheckedBox]#1}
\newcommand{\doneItem}{\item \CheckedBox~}
\begin{document}
Using \texttt{\textbackslash doneItem} (nice) and \texttt{\textbackslash todoitem} (not nice) in a \texttt{\textbackslash itemize}.
\begin{itemize}
\doneItem Code the input for the new variables
\todoitem Code the $y$-mapping
\notdoneitem Code the $z$-mapping
\item Code the averaging
\end{itemize}
Using \texttt{\textbackslash doneitem} (nice) and \texttt{\textbackslash todoItem} (not nice) in a \texttt{\textbackslash enumerate}.
\begin{enumerate}
% \doneitem Code the input for the new variables
\doneItem Code the input for the new variables
\todoItem Code the $y$-mapping
\item Code the averaging
\end{enumerate}
\end{document}
(为了更好地理解,留下了不正确使用的待办事项。)
答案3
我仍然不太确定您的要求。但您想对两种环境使用相同的命令,从而产生不同的结果。这可以借助 来完成。根据需要etoolbox
更改。\newcommand*
\documentclass{article}
\usepackage{wasysym}
\usepackage{etoolbox}
\AtBeginEnvironment{itemize}{
\newcommand*\notdoneitem{\item[\XBox]~}
\newcommand*\todoitem{\item[\Square]~}
\newcommand*\doneitem{\item[\CheckedBox]~}
}
\AtBeginEnvironment{enumerate}{
\newcommand*\todoitem{\item \Square~}
\newcommand*\doneitem{\item \CheckedBox~}
}
\begin{document}
Using \texttt{\textbackslash doneItem} (nice) and \texttt{\textbackslash todoitem} (not nice) in a \texttt{\textbackslash itemize}.
\begin{itemize}
\doneitem Code the input for the new variables
\todoitem Code the $y$-mapping
\item Code the averaging
\end{itemize}
Using \texttt{\textbackslash doneitem} (nice) and \texttt{\textbackslash todoItem} (not nice) in a \texttt{\textbackslash enumerate}.
\begin{enumerate}
\doneitem Code the input for the new variables
\todoitem Code the $y$-mapping
\item Code the averaging
\end{enumerate}
\end{document}