图片说明了一切:
我不确定发生了什么,但似乎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
您不想在这里使用开关disable
和enable
。问题是disable
确实会完全关闭microtype
,因此它没有机会执行您希望它执行的操作。第一次这样做没问题,而在第二种情况下则不行:由插入的列表触发,打字机字体现在和以后都设置为突出。因为您随后再次禁用microtype
,所以此突出将不会被停用。而这个突出(左括号的突出{
)就是使方框不合理的原因。
因此,您不应该使用dis/enable
(明确“未记录”!),而应该将lrbox
代码括在以下内容中:
\microtypesetup{activate=false}%
...
\microtypesetup{activate=true}%