我想要行内代码原样输出,\ {}等特殊字符不需要转义就能原样输出,还要能自动换行,单词断词换行时最好能用连字符-连接。用过\verb命令,但不能自动换行,用过\lstinline,但这个和\verb差不多,也不能自动换行。阅读过listings宏包说明,并没有发现\lstinline的设置选项。

为什么 \verb 命令中空格不能断行? 因为在使用 \verb 后,空格字符临时被定义为一个宏 \@xobeysp,这个宏展开是 \nobreakspace。为什么 \verb 中单词不能加连字符断词?
因为 \verb 使用的字体 \ttfamily 默认本身就不能断词。为什么 \ttfamily 默认不能断词? 因为在定义相关字体族时,会用 \hyphenchar 显式定义该字体连字符的编码为 -1,意思就是禁用连字符。此外,除非使用 LuaTeX,TeX 还规定一段第一个单词不能断词。这也会禁止一部分 \verb 中的断词。 参考 LaTeX 内核中 \verb 的实现,我们可以一一解决此问题:
  1. 让空格可以断行同时不被吃掉,可以重定义 \@xobeysp 为 \hspace{0pt}\mbox{ }\hspace{0pt}
  2. 允许连字符,可以重设 \hyphenchar
  3. 在 \verb 开始处增加 \hspace*{0pt} 设置一个虚拟词,以允许第一个词后断开。
不过呢,这个要求比较怪。主要是连字符。需要使用特殊字符的代码中所有字符都可能是有特别意义的,通常都不能接受混入多余的连字符,以免与减号之类的混淆。 而如果只是允许空格断行的话,不需要上面的方式,很多宏包就可以完成了。例如 listings 可以全局或局部设置 breaklines 选项,如果你仔细读文档了的话。
\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}
verb-linebreak
注意 listings 的断行规则可能严一些,空格也是可伸缩的。 此外,如果是 url、文件路径之类东西,用 url 宏包的 \url 更好。它的实现原理与 \verb 之类命令不大一样,断行规则也不同。 作者:刘海洋 链接:https://www.zhihu.com/question/53129242/answer/133706336 来源:知乎 著作权归作者所有,转载请联系作者获得授权。

点赞(1)

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部