\lstlisting 中的预断点导致 \rotatebox 出现错误

\lstlisting 中的预断点导致 \rotatebox 出现错误

当与中\rotatebox的非正交(非 90 的倍数)角度一起使用时,命令会产生错误。以下是示例:prebreak\lstlisting

\documentclass{article}
\usepackage{graphicx, listings}
%\usepackage{makerobust}
%\MakeRobustCommand\rotatebox

\begin{document}
\begin{lstlisting}[
  language={}, basicstyle=\ttfamily, frame=single,
  breaklines=true, breakatwhitespace=true,
  prebreak=\mbox{\space\rotatebox[origin=c]{45}{$<$}}
% prebreak=\mbox{\space\protect\rotatebox[origin=c]{45}{$<$}}
]
abcd00 efgh01 ijkl02 mnop03 qrst04 uvwx05 yzab06 cdef07 ghij08 klmn09 opqr10 stuv11 wxyz12 
\end{lstlisting}
\end{document}

产生的错误是:

! Illegal unit of measure (pt inserted).
<to be read again>
                   \kern
l.13 abcd00
            efgh01 ijkl02 mnop03 qrst04 uvwx05 yzab06 cdef07 ghij08 klmn09 o...

您可能已经注意到了评论,我已经知道这\rotatebox很脆弱,并且尝试了这两种方法\protect\MakeRobustCommand但都没有解决问题。一个有趣的观察是,当给定的旋转角度是 90 的倍数时,该命令有效。

答案1

这里的问题是listings重新定义\space了内部排版代码,但\rotatebox依赖于原始定义。\rotatebox必须根据传递的度数进行一些三角计算,因此错误只会在非平凡的旋转值时出现。

\space一个简单的解决方法是在使用之前在本地恢复原始定义\rotatebox

\documentclass{article}
\usepackage{graphicx, listings}

\begin{document}
\begin{lstlisting}[
  language={}, basicstyle=\ttfamily, frame=single,
  breaklines=true, breakatwhitespace=true,
  prebreak=\mbox{\space\def\space{ }\rotatebox[origin=c]{45}{$<$}}
]
abcd00 efgh01 ijkl02 mnop03 qrst04 uvwx05 yzab06 cdef07 ghij08 klmn09 opqr10 stuv11 wxyz12 
\end{lstlisting}
\end{document}

输出

在此处输入图片描述

相关内容