自定义枚举列表重置条件变量

自定义枚举列表重置条件变量

我定义了一个这样的新列表:

\usepackage{enumitem}
\usepackage{mdframed}

\newcommand{\questionlabel}{Question }
\newcommand{\restorequestionlabel}{\renewcommand{\questionlabel}{Question }}
\newcommand{\setquestionlabel}[1]{\renewcommand{\questionlabel}{#1 }}
\newlist{questions}{enumerate}{4}
\setlist[questions]{
    align=left,
    ref=\questionlabel\arabic*,
    label=\textbf{\questionlabel\arabic*.},
    wide
}
\newif\ifquestionsincludelabel
\newcommand{\includelabel}{\questionsincludelabeltrue}
\newcommand{\excludelabel}{\questionsincludelabelfalse}
\newcommand{\question}[2][]{
    \needspace{10\baselineskip}
    \ifquestionsincludelabel \item #1 \else \item[] #1 \fi
    \mbox{}\begin{mdframed}#2\end{mdframed}
}

\includelabel它使用条件来确定是否打印标签。每次以 开始新列表时,是否有办法重置此条件(即执行 ) ?如果使用 定义,\begin{questions}则很容易做到,但它使用的是。questions\newenvironmentenumitemnewlist

PS 当执行条件分支时\item[],计数器不会递增。我想自动执行此操作,但\addtocounter{???}{1}由于我不知道计数器的名称,因此无法执行此操作。有没有办法定位当前列表或最里面的列表(questionsiquestionsii等)?

答案1

对你的问题的简短回答是你只需要添加

 before=\includelabel

的定义questions。事实上,我只需\ifquestionsincludelabel直接使用

\setlist[questions]{
    align=left,
    ref=\questionlabel\arabic*,
    label=\textbf{\questionlabel\arabic*.},
    wide,
    before=\questionsincludelabeltrue
}

话虽如此,我想知道您是否需要使用\ifquestionsincludelabel,以及是否可以通过定义带星号的版本来提供更好的语法,\question以便\question包含标签并且\question*不包含标签。定义\question这种方式的最简单方法是\NewDocumentCommand使用解析包裹:

\NewDocumentCommand{\question}{ s O{} m }{
    \needspace{10\baselineskip}
    \IfBooleanTF{#1}{\item #2}{\item[]#2}
    \mbox{}\begin{mdframed}#3\end{mdframed}
}

不过,您可能想切换加星号和不加星号的行为。

表示s O{} m该命令有三个参数:

  • 可选的“*”为#1。如上所述,您可以测试是否*已使用

     \IfBooleanTF{#1}{...true code}{...false code}
    
  • 可选标签 ,#2默认为{}。(这是您之前的#1。)

  • 强制性的#3,放在mdfamed环境内部

有关详细信息,请参阅xparse 手册. 可读性很强。

以下是完整的最小工作示例

\documentclass[a4paper,10pt]{article}
\usepackage{xparse}
\usepackage{enumitem}
\usepackage{mdframed}

\newcommand{\questionlabel}{Question }
\newcommand{\restorequestionlabel}{\renewcommand{\questionlabel}{Question }}
\newcommand{\setquestionlabel}[1]{\renewcommand{\questionlabel}{#1 }}
\newlist{questions}{enumerate}{4}
\setlist[questions]{
    align=left,
    ref=\questionlabel\arabic*,
    label=\textbf{\questionlabel\arabic*.},
    wide,
    before=\questionsincludelabeltrue
}
\newif\ifquestionsincludelabel
\newcommand{\includelabel}{\questionsincludelabeltrue}
\newcommand{\excludelabel}{\questionsincludelabelfalse}
\NewDocumentCommand{\question}{ s O{} m }{
    \needspace{10\baselineskip}
    \IfBooleanTF{#1}{\item #2}{\item[]#2}
    \mbox{}\begin{mdframed}#3\end{mdframed}
}

\begin{document}

  \begin{questions}
    \question {Some text}
    \question[2]{More text}
    \question*{Even more text}
    \question*[4]{Last bit of text }
  \end{questions}
\end{document}

输出如下:

在此处输入图片描述

顺便说一句,我不清楚你是否需要将其包装在环境中enumerate,因为除了明确表示所有问题都属于“一起”之外,它并没有做太多事情。你可以用类似这样的方法做得同样好:

\newcounter{question}
\NewDocumentCommand{\question}{ s O{} m }{%
        \needspace{10\baselineskip}%
        \refstepcounter{question}%
        \IfBooleanTF{#1}%
          {\item \textbf{\questionlabel\space\thequestion} #2}%
          {\item[]#2}%
        \mbox{}\begin{mdframed}#3\end{mdframed}
    }

相关内容