microtype、listing 和 lrbox:这里到底发生了什么?

microtype、listing 和 lrbox:这里到底发生了什么?

图片说明了一切:

在此处输入图片描述

我不确定发生了什么,但似乎microtype“破坏”了lrbox着色的 hack \lstinline。代码如下:

\documentclass[a4paper]{article}

\pagestyle{empty}

\usepackage[T1]{fontenc}
\usepackage{listings,xparse,xcolor,microtype}

\lstset{
    basicstyle = \ttfamily,
    columns = fullflexible,
}

\newsavebox\mybox

\DeclareDocumentCommand \boxlst{ O{} v } {%
    \microtypesetup{disable}%           Disable microtype for this piece of code
    \begin{lrbox}{\mybox}%              Put the listing in an lrbox
    \lstinline[#1]@#2@%                 Make the listing
    \end{lrbox}%
    {\colorbox{yellow}{\unhbox\mybox}}% Typeset the listing in a yellow box
    \microtypesetup{enable}%            Re-enable microtype
}

% Uncommenting the following line -- i.e., disabling the boxes altogether, makes all fine
%\let\boxlst\lstinline

\begin{document}

Bla bla.


First time it works:\\
xxx \boxlst!{a|}! xxx 
\\
xxx \boxlst!aa|a! xxx
\\
xxx \boxlst!a{|}! xxx

Second time it works:\\
xxx \boxlst!{a|}! xxx 
\\
xxx \boxlst!aa|a! xxx
\\
xxx \boxlst!a{|}! xxx

%\lstinline!Test! xxx
\begin{lstlisting}
Include any "unboxed" listing here --- inline or
environment --- and it starts failing:
\end{lstlisting}

Now it fails:\\
xxx \boxlst!{a|}! xxx
\\
xxx \boxlst!aa|a! xxx
\\
xxx \boxlst!a{|}! xxx

Now it also fails:\\
xxx \boxlst!{a|}! xxx
\\
xxx \boxlst!aa|a! xxx
\\
xxx \boxlst!a{|}! xxx


\end{document}

答案1

您不想在这里使用开关disableenable。问题是disable确实会完全关闭microtype,因此它没有机会执行您希望它执行的操作。第一次这样做没问题,而在第二种情况下则不行:由插入的列表触发,打字机字体现在和以后都设置为突出。因为您随后再次禁用microtype,所以此突出将不会被停用。而这个突出(左括号的突出{)就是使方框不合理的原因。

因此,您不应该使用dis/enable(明确“未记录”!),而应该将lrbox代码括在以下内容中:

\microtypesetup{activate=false}% 
...
\microtypesetup{activate=true}% 

相关内容