我定义了一个exercise
如下环境:
\newcounter{exercise}
\NewDocumentEnvironment{exercise}{o +b}%
{%
\IfNoValueTF{#1}
{\stepcounter{exercise}}
{\setcounter{exercise}{#1}}%
\par\noindent\makebox[2em][l]{\textbf{\theexercise.}}%
\hangindent = 3em \hangafter = 1 #2\par}%
{\ignorespacesafterend}
我测试如下:
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{enumitem}
\usepackage{lipsum}
\newcounter{exercise}
\NewDocumentEnvironment{exercise}{o +b}%
{%
\addvspace{\topsep}%
\IfNoValueTF{#1}
{\stepcounter{exercise}}
{\setcounter{exercise}{#1}}%
\par\noindent\makebox[2em][l]{\textbf{\theexercise.}}%
\hangindent = 3em \hangafter = 1 #2\par}%
{\ignorespacesafterend}
\begin{document}
\begin{exercise}[8]
\lipsum[1][1-2]
\end{exercise}
\begin{exercise}
\lipsum[1][3-4]
\end{exercise}
\begin{exercise}[11]
\lipsum[1][5-6]
\begin{enumerate}[label = \textbf{\alph*.}]
\item \lipsum[2][1-2]
\item \lipsum[2][3-4]
\item \lipsum[2][5]
\end{enumerate}
\end{exercise}
\end{document}
输出:
垂直红线是我自己添加的。我的问题是如何完善代码,使枚举部分可以自动从行的右侧开始(即使其也具有相应的缩进)?
答案1
我认为这会产生你想要的结果:
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{enumitem}
\usepackage{lipsum}
\newcounter{exercise}
% Courtesy: https://tex.stackexchange.com/a/278219
% Thanks Zarko!
\newcommand*{\entrylabel}[1]{%
\makebox[\labelwidth][l]{%
\parbox[t]{\labelwidth}{\raggedright#1}%
}%
}
\NewDocumentEnvironment{exercise}{ o }{%
\IfNoValueTF{#1}%
{\stepcounter{exercise}}%
{\setcounter{exercise}{#1}}%
\list{\textbf{\theexercise.}}{%
\renewcommand{\makelabel}{\entrylabel}%
\setlength{\labelwidth}{2em}%
\setlength{\labelsep}{1em}%
\setlength{\leftmargin}{2em}%
\setlength{\itemindent}{-1em}%
}%
\item
}%
{%
\endlist
}
\begin{document}
\begin{exercise}[11]
\lipsum[1][5-6]
\begin{enumerate}[label = \textbf{\alph*.}]
\item \lipsum[2][1-2]
\item \lipsum[2][3-4]
\item \lipsum[2][5]
\end{enumerate}
\end{exercise}
\begin{exercise}[111]
\lipsum[1][1-2]
\end{exercise}
\begin{exercise}
\lipsum[1][3-4]
\end{exercise}
\end{document}
请注意,有一些变化:
- 我根本不使用
+b
参数。可以跳过。这样更好,因为它可以包含逐字文本。 - 我转向 LaTeX 的列表机制。
- 通过删除缩进命令,我显著减少了您的代码,它们可以通过 LaTeX 列表很好地处理。
答案2
使用left
标记标签开始和文本开始的键(3em
和5.5em
,均相对于侧边距)。
然后使用\itemindent = -1em
(= 2em - 3em) 您将获得与编号段落相同的第二行缩进。
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{enumitem}
\usepackage{lipsum}
\newcounter{exercise}
\NewDocumentEnvironment{exercise}{o +b}%
{%% \setlist added <<<<<<<<<<<<<<<<
\setlist[enumerate]{label = \textbf{\alph*.},
align=left,%<<<
itemindent=-1.0em, % 2em-3em <<<<<<<<<<<
left=3em .. 5.5em}% start of the label .. start of the text <<<<<<<<<<
\addvspace{\topsep}%
\IfNoValueTF{#1}
{\stepcounter{exercise}}
{\setcounter{exercise}{#1}}%
\par\noindent\makebox[2em][l]{\textbf{\theexercise.}}%
\hangindent = 3em \hangafter = 1 #2\par
}%
{\ignorespacesafterend}
\usepackage{showframe}% ONLY to show the margins <<<<<<
\begin{document}
\begin{exercise}[8]
\lipsum[1][1-2]
\end{exercise}
\begin{exercise}
\lipsum[1][3-4]
\end{exercise}
\begin{exercise}[11]
\lipsum[1][5-6]
\begin{enumerate}
\item \lipsum[2][1-2]
\item \lipsum[2][3-4]
\item \lipsum[2][5]
\end{enumerate}
\end{exercise}
\end{document}