Microtype 和 quote 环境导致首行缩进不同

Microtype 和 quote 环境导致首行缩进不同

microtype加载包时quote,以标点符号开头的环境会“缩进”不一致。以下最小示例中的第一行不受影响,即与没有包时位于同一位置,但接下来的两行被推到了左边。我意识到这是一个特征包中的microtype将标点符号推入页边距的功能,但这里看起来相当丑陋,因为它不一致。第一行很可能因为包含\item在 中而有所不同\begin{quote}

有没有办法让缩进保持一致?我可以暂时禁用此功能,microtype仅针对此环境吗?我在一些软件包手册中遇到了这样的代码,其中一些逐字代码行以“标点符号”开头,就像{quote环境中一样。

\documentclass{article}
\usepackage{microtype}
\begin{document}
text text text text text text text text text text text text text text text text
\begin{quote}
    ()\\
    ()\\
    ()
\end{quote}
text text text text text text text text text text text text text text text text
\end{document}

结果

答案1

microtype 作者建议的解决方案是这样的:

\documentclass{article}
\usepackage{microtype}
\makeatletter
\newcommand*\protrudeleft[1]{%
    {\everypar{}%
     \setbox\z@\vbox{\noindent#1}%
     \vbadness=\@M
     \splittopskip=\z@
     \global\setbox\z@=\vsplit\z@ to \baselineskip
     \unvbox\z@ \global\setbox\z@=\lastbox
    }%
    \ifhbox\z@
      \leavevmode
      \kern\leftmarginkern\z@
    \fi
    #1}
\makeatother
\begin{document}
text text text text text text text text text text text text text text text
text
\begin{quote}
    \protrudeleft()\\
    ()\\
    ()
\end{quote}
text text text text text text text text text text text text text text text
text
\end{document}

注意:如果 \protrudeleft 参数不是像这里一样的简单字符,你可能需要将其放在括号中。

答案2

主要的microtype可以使用命令动态启用或禁用功能\microtypesetup。在这种情况下,我们需要本地禁用字符突出:

\documentclass{article}
\usepackage{microtype}

\newenvironment{example}{\microtypesetup{protrusion=false}%
  \begin{quote}}{\end{quote}}

\begin{document}
text text text text text text text text text text text text text text text text
\begin{example}
    ()\\
    ()\\
    ()
\end{example}
text text text text text text text text text text text text text text text text
\end{document}

这当然会对所有的字符产生影响,无论是它()还是其他符号。一个有趣的任务是选择性地如果要对除 之外的符号保持启用状态,请禁用此功能()

答案3

我会定义自己的microtype安全环境,使其始终在任何地方都有突出部分。根据3em您的需要进行调整:

\documentclass{article}
\usepackage{microtype}
\newenvironment{mtsafequote}
    {\par\bgroup\leftskip=3em\rightskip=3em\noindent\ignorespaces}
    {\par\egroup\noindent}
\begin{document}
text text text text text text text text text text text text text text text text
\begin{mtsafequote}
    ()\\
    ()\\
    ()
\end{mtsafequote}
text text text text text text text text text text text text text text text text
\end{document}

答案4

马丁,这就是需要的核心。我认为你比我更有资格将其包装到一个非常强大的重新定义的quote环境中(或者可能在list,\item级别修复它):

\begin{quote}
    \quitvmode\kern\dimexpr-0.001em*\the\lpcode\font`(\relax()\\
    ()\\
    ()
\end{quote}

相关内容