我的目标是制作一个带有阿拉伯数字的列表,每个阿拉伯数字都有一个带有拉丁数字的子列表。每个阿拉伯数字项目代表一个一般类别,每个拉丁数字项目代表该类别中的一个问题。
每次回答完问题后,我都想输入答案。因此,我尝试使用一个枚举,在枚举内再输入一个枚举,然后每当我需要写一段话来回答问题时,我都会结束内部枚举,写一段话,然后在完成后继续枚举。示例如下:
\documentclass{article}
\usepackage{enumitem}
\begin{document}
\begin{enumerate}
\item{}
\begin{enumerate}[label=\roman*)]
\item{Question:}
\end{enumerate}
My answer
\begin{enumerate}[resume,label=\roman*)]
\item{Question 2:}
\end{enumerate}
My second answer
\end{enumerate}
\end{document}
这种方法的问题在于答案文本与外部枚举的缩进绑定在一起。如果我也退出外部枚举,我将无法在不重新开始编号的情况下重新启动枚举,因为如果没有当前项目,我似乎无法使用枚举。
另外需要注意的是,我希望将拉丁数字列表项保留在缩进内,同时允许段落文本保持不缩进。
我该如何最好地获取期望的效果?
答案1
修改后的答案(使用\leftskip
)
修改后的答案将允许在答案中间分页。
\documentclass{article}
\usepackage{enumitem,lipsum}
\usepackage[pass,showframe]{geometry}
\newcommand\myanswer[1]{{%
\leftskip-\dimexpr\leftmargini+\leftmarginii\relax #1\par}}
\begin{document}
\begin{enumerate}
\item{}
\begin{enumerate}[label=\roman*),parsep=5pt]
\item Question: What is the margination if my question
goes on long enough?
\myanswer{My answer shows that the answer will retain the
proper margination if one uses the macro
\textbackslash myanswer.}
\end{enumerate}
\begin{enumerate}[resume,label=\roman*),parsep=5pt]
\item{Question 2:}
\myanswer{My second answer}
\end{enumerate}
\begin{enumerate}[resume, label=\roman*),parsep=5pt]
\item{Question 3:}
\myanswer{My third answer \lipsum[4-8]}
\end{enumerate}
\end{enumerate}
\end{document}
原始答案
也许像这样,用于listparindent
取消项目额外段落的缩进。这里的用法关键是
\item
使答案成为问题的一部分。\myanswer
如果您的答案超过一行,请使用来排版您的答案。
妇女权利委员会:
\documentclass{article}
\usepackage{enumitem}
\usepackage[pass,showframe]{geometry}
\newcommand\myanswer[1]{\parbox[t]{\textwidth}{#1}}
\begin{document}
\begin{enumerate}
\item{}
\begin{enumerate}[label=\roman*),parsep=5pt,
listparindent=-\dimexpr\leftmargini+\leftmarginii\relax]
\item Question: What is the margination if my question
goes on long enough?
\myanswer{My answer shows that the answer will retain the
proper margination if one uses the macro
\textbackslash myanswer.}
\end{enumerate}
\begin{enumerate}[resume,label=\roman*),parsep=5pt,
listparindent=-\dimexpr\leftmargini+\leftmarginii\relax]
\item{Question 2:}
\myanswer{My second answer}
\end{enumerate}
\begin{enumerate}[resume, label=\roman*),parsep=5pt,
listparindent=-\dimexpr\leftmargini+\leftmarginii\relax]
\item{Question 3:}
\myanswer{My third answer}
\end{enumerate}
\end{enumerate}
\end{document}
答案2
您可以使用 TeX 原语\parshape
来转义所有列表环境引入的缩进。下面的代码应该可以满足您的要求:
\documentclass{article}
\usepackage{enumitem}
\usepackage{lipsum} %% <- for \lipsum
\makeatletter %% <- make @ usable in macro names
\newcommand*\answer[1]{%
\begingroup %% <- limit scope of the following changes
\par %% <- start a new paragraph
\@totalleftmargin=0pt \linewidth=\columnwidth
%% ^^ let other commands know that the margins have been reset
\parshape 0
%% ^^ reset the margins
#1\par %% <- insert #1 and end this paragraph
\endgroup
}
\makeatother %% <- revert @
\begin{document}
\lipsum[66]
\begin{enumerate}
\item
\begin{enumerate}[label=\roman*)]
\item
Question 1:
\answer{\lipsum[75]}
\item
Question 2:
\answer{\lipsum[75]}
\end{enumerate}
\end{enumerate}
\end{document}
您也可以answer
使用以下方式定义环境
\makeatletter %% <- make @ usable in macro names
\newenvironment*{answer}{%
\par
\@totalleftmargin=0pt \linewidth=\columnwidth
\parshape 0
}{\par}
\makeatother %% <- revert @
关于\parshape
:
在底层,所有列表命令都用于\parshape
更改边距。虽然它可以用来做更多,如果你只想改变当前(以及所有后续)段落的缩进/宽度,你可以调用
\@totalleftmargin=<new indentation> \linewidth=<new line width>
\parshape 1 \@totalleftmargin \linewidth
您也可以只写\parshape 1 <new indentation> <new width>
,但段落内的其他命令(例如列表环境)将不知道您设置的边距(并采用旧值)。撤消先前发出的s\parshape 0
的效果。\parshape