警告

警告

(通过这个问题,我希望解决与我的引用包裹。)

假设我为显示的文本定义了一个自定义环境。它类似于标准 LaTeX 环境quote(即,它基于环境list),但作为一项改进,当(且仅当)环境前面有一个空行时,环境的第一行应该缩进。目前,我通过测试垂直模式(并进行\itemindent相应设置)来实现这一点。但是,对于紧随其后的环境,此测试失败\begin{document}。无论我写

\begin{document}

\begin{myquote}% First line of following text should be indented

或者

\begin{document}
%
\begin{myquote}% First line of following text shouldn't be indented

环境的第一行myquote始终是缩进的。(请参阅下面完整的 MWE。)我应该如何修改/修改空白行(“段落”)的测试,以便也能在之后立即工作\begin{document}

\documentclass{article}

\makeatletter
\newenvironment{myquote}{%
  \list{}{%
    \setlength{\rightmargin}{\leftmargin}%
    \setlength{\itemindent}{%
      \ifvmode
        \parindent
      \else
        \z@
      \fi
    }%
  }%
  \item\relax
}{%
  \endlist
}
\makeatother

\newcommand{\sometext}{Hello, here is some text without a meaning. This
    text should show, how a printed text will look like at this place.}

\begin{document}
%
\begin{myquote}
\emph{This line shouldn't be indented, but it is.} \sometext
\end{myquote}

Nomal running text. \sometext
%
\begin{myquote}
This line shouldn't be indented, and it isn't. \sometext
\end{myquote}

Normal running text. \sometext

\begin{myquote}
This line should be indented, and it is. \sometext
\end{myquote}

Normal running text. \sometext

\end{document}

答案1

这似乎有效,但如果\par在文档启动时使用重新定义的其他环境,它可能会中断。

\usepackage{etoolbox}
\makeatletter
\def\lock@reset{\global\let\iflock@check\iffalse
  \global\let\par\endgraf
  \global\let\lock@reset\relax}
\appto\document{\let\iflock@check\iftrue\def\par{\endgraf\lock@reset}}

\newenvironment{myquote}{%
  \list{}{%
    \setlength{\rightmargin}{\leftmargin}%
    \setlength{\itemindent}{%
      \ifvmode
    \iflock@check\z@\else\parindent\fi
      \else
    \z@
      \fi
    }%
  }%
  \item\relax
}{%
  \endlist\lock@reset
}
\makeatother

警告

代码似乎可以工作,但我不建议使用它,原因如下。首先是实际原因。有多少文档以引号开头\begin{document}

第二个原因。用 做东西\document是件坏事;实际上代码可以进入\AtBeginDocument,但对 以同样方式行动的其他包怎么办\par

\par只是为了对称而采取一些卑鄙的手段是不值得的。

@Lockstepquoting:请不要向您的包中添加这样的“功能”;而是在之后的环境中添加警告和避免缩进的方法\begin{document};这更容易,而且可能永远不会被使用。

此外,quoting环境总是当它遵循某些环境时,无论中间是否有空行,它都会有一个初始缩进:例如,,flushleft或。因此,决定是否需要缩进的关键可能非常有用。centerflushrightsloppypar

相关内容