替换 *itemize* \item 中的项目符号,但不替换 *enumerate* \item 中的数字

替换 *itemize* \item 中的项目符号,但不替换 *enumerate* \item 中的数字

我正在用 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}

生成结果:

在此处输入图片描述

有没有办法\todoitemitemize环境中执行与我的相同的操作,但我\todoItem在里面\enumerate?我可以/应该测试我所处的环境吗?

答案1

如果我理解了你的问题,你是想根据它们是在或环境中被调用来\doneitem附加不同的含义。\todoitemenumerateitemize

可以通过将宏定义的代码移到环境“开始”阶段执行的代码中来实现,而不是在序言中赋予它们全局含义。最快的解决方法是使用序言中的以下代码:

\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 itemfor itemize,with Itemfor 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}

在此处输入图片描述

相关内容