自定义环境中的缩进问题

自定义环境中的缩进问题

我定义了一个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}

请注意,有一些变化:

  1. 我根本不使用+b参数。可以跳过。这样更好,因为它可以包含逐字文本。
  2. 我转向 LaTeX 的列表机制。
  3. 通过删除缩进命令,我显著减少了您的代码,它们可以通过 LaTeX 列表很好地处理。

答案2

使用left标记标签开始和文本开始的键(3em5.5em,均相对于侧边距)。

然后使用\itemindent = -1em(= 2em - 3em) 您将获得与编号段落相同的第二行缩进。

C

\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}

相关内容