![自定义枚举列表重置条件变量](https://linux22.com/image/364741/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9E%9A%E4%B8%BE%E5%88%97%E8%A1%A8%E9%87%8D%E7%BD%AE%E6%9D%A1%E4%BB%B6%E5%8F%98%E9%87%8F.png)
我定义了一个这样的新列表:
\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
\newenvironment
enumitem
newlist
PS 当执行条件分支时\item[]
,计数器不会递增。我想自动执行此操作,但\addtocounter{???}{1}
由于我不知道计数器的名称,因此无法执行此操作。有没有办法定位当前列表或最里面的列表(questionsi
,questionsii
等)?
答案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}
}