我想要行内代码原样输出,\ {}等特殊字符不需要转义就能原样输出,还要能自动换行,单词断词换行时最好能用连字符-连接。用过\verb命令,但不能自动换行,用过\lstinline,但这个和\verb差不多,也不能自动换行。阅读过listings宏包说明,并没有发现\lstinline的设置选项。
为什么 \verb 命令中空格不能断行?
因为在使用 \verb 后,空格字符临时被定义为一个宏 \@xobeysp,这个宏展开是 \nobreakspace。为什么 \verb 中单词不能加连字符断词?
因为 \verb 使用的字体 \ttfamily 默认本身就不能断词。为什么 \ttfamily 默认不能断词?
因为在定义相关字体族时,会用 \hyphenchar 显式定义该字体连字符的编码为 -1,意思就是禁用连字符。此外,除非使用 LuaTeX,TeX 还规定一段第一个单词不能断词。这也会禁止一部分 \verb 中的断词。
参考 LaTeX 内核中 \verb 的实现,我们可以一一解决此问题:
- 让空格可以断行同时不被吃掉,可以重定义 \@xobeysp 为 \hspace{0pt}\mbox{ }\hspace{0pt}
- 允许连字符,可以重设 \hyphenchar
- 在 \verb 开始处增加 \hspace*{0pt} 设置一个虚拟词,以允许第一个词后断开。
\documentclass{article} \usepackage{etoolbox} \makeatletter \def\@xobeysp{\hspace{0pt}\mbox{ }\hspace{0pt}} \appto\verbatim@font{\hyphenchar\font`-\relax} \apptocmd\@sverb{\hspace*{0pt}}{}{} \makeatother \usepackage{listings} \lstset{basicstyle={\normalfont\sffamily},breaklines} \begin{document} \parindent=0pt \hsize=4em \verb|#Hyphenation# and %allowlinebreak%| \lstinline|this is also breakable| \end{document}
注意 listings 的断行规则可能严一些,空格也是可伸缩的。
此外,如果是 url、文件路径之类东西,用 url 宏包的 \url 更好。它的实现原理与 \verb 之类命令不大一样,断行规则也不同。
作者:刘海洋
链接:https://www.zhihu.com/question/53129242/answer/133706336
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
发表评论 取消回复