(通过这个问题,我希望解决与我的引用包裹。)
假设我为显示的文本定义了一个自定义环境。它类似于标准 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
或。因此,决定是否需要缩进的关键可能非常有用。center
flushright
sloppypar