在继续之前,我想告诉读者,我知道通常不鼓励重新实现软件包已经支持的功能。
- 自动逐字换行有一个可接受的答案,但未解决问题。答案建议使用
listings
。 - https://tex.stackexchange.com/a/14345/13552是对上述问题的回答,使用空格作为断点。这对许多应用程序都很有用,但并非所有应用程序都很有用(例如 HL7 消息,它不使用空格)。
提供文字字符支持的软件包
- LaTeX2e 的原生
verbatim
verbatim
重新实现原生 LaTeX2everbatim
spverbatim
逐字逐句的分支几乎满足我的要求但只支持空格并且不支持自定义环境名称fancyvrb
listings
支持UTF-8 支持和 XeLaTeX,但有限制,与和breaklines=true
结合使用时会导致文本变白(见tcolorbox
xelatex
为什么分页符和列表 + tcolorbox + xelatex 之后文本会变成白色(可能是范围泄漏?)?)minty
需要外部脚本并且不支持分页符verbments
需要外部 Python 脚本
目标
我希望通过自己(部分)实践来获得答案并获得一些理解。最终,我想了解逐字文本中的换行是如何工作的。
verbatim
支持分页符,但不支持换行符(编程术语中为换行)。我想利用该verbatim
包来处理代码,但需要换行符。在阅读
verbatim
和spverbatim
文档之后,我了解到的定义\@xobeysp
是目标宏用于实现空格处的中断。出于好玩和实际原因,我想自己实现该包的功能。在此过程中,我想了解文档中说我可以使用钩子来修改环境spverbatim
是什么意思。verbatim
verbatim
\every@verbatim
也许我可以使用2001/03/12 版
\addto@hook<nameofhook>{commands to be added}
第 4 页中提到的内容?verbatim
这两个软件包都有很好的文档。不过,我还是需要一点帮助才能克服困难。
verbatim
我对允许换行的环境的想法
\verbatim@processline
也许可以在一行中的字符总长度大约达到时插入代码来中断该行\textwidth
。
我对自定义环境的想法verbatim
(不受支持的功能spverbatim
),允许在空格处中断
verbatim
2001/03/12 版本第 2 页的文档中解释了创建自定义环境的机制。
尝试 1
尝试直接使用逐字破解\addto@hook
。
\usepackage{verbatim}% http://ctan.org/pkg/verbatim
\makeatother
\addto@hook\every@verbatim{\def\xobeysp{\mbox{}\space}}
\makeatletter
第二次尝试
尽力模仿spverbatim
。
\def\@xobeysp{\leavevmode\penalty10000\ }
通过重新定义,可以将不可破坏空间更改为可破坏空间\def\@xobeysp{\mbox{}\space}
我知道我离创建自己的可拆分空间环境已经非常近了!
spverbatim.sty
它足够小,我可以轻松克隆它并修改环境的名称。但是,似乎我还缺少一些步骤。
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{myverbatim}
[2016/05/11 v1.0 Verbatim with breakable spaces based on spverbatim]
\gdef\spverb{%
\bgroup
\let\spverb@ve=\verb@egroup
\def\verb@egroup{\spverb@ve\egroup}%
\def\@xobeysp{\mbox{}\space}%
\verb
}
\begingroup
\catcode`|=0
\catcode`[=1
\catcode`]=2
\catcode`\{=12
\catcode`\}=12
\catcode`\\=12
|gdef|spv@xverbatim#1\end{mycode}[#1|end[mycode]]
|endgroup
\newenvironment{mycode}{%
\def\@xobeysp{\mbox{}\space}%
\let\@xverbatim=\spv@xverbatim
\verbatim
}{%
}
\endinput
现在我有一个mycode
环境了。
\documentclass{article}
\usepackage{fontspec} % typeset with xelatex
\usepackage{myverbatim} % custom package providing "mycode" env
\begin{mycode}
line-breakable literal characters { [ ] } $ &.
\end{mycode}
\end{document}
解析器仍然在读取\end{mycode}
并导致错误。
就像是
! LaTeX Error: \begin{mycode} on input line 5 ended by \end{document}.
我在这里做错了什么?
第三次尝试
克隆verbatim.sty
代码并替换\xobeysp
定义:
%\def\@xobeysp{\leavevmode\penalty\@M\ }
\def\@xobeysp{\mbox{}\space}
替换\usepackage{verbatim}
为新版本后,我可以编译文档,但行仍然不会在空格处断开。
限制spverbatim
这个包不允许我像在 中那样创建自己的环境verbatim
。在写这个问题时,我通过电子邮件向作者发送了此事。
在中创建自定义环境verbatim
为了完整起见,下面是创建新环境的方法:
\newenvironment{mycode}%
{\endgraf\small\verbatim}%
{\endverbatim}
第一次尝试的伪代码
\documentclass{article}
\usepackage{fontspec} % typeset with xelatex
\usepackage{verbatim}
\makeatother
\addto@hook\every@verbatim{\def\xobeysp{\mbox{}\space}}% similar to http://ctan.org/pkg/spverbatim
\makeatletter
\begin{document}
\begin{mycode}
Here is some nice long code that should support breaks after each space, and not have the original penalty of 10000 like in the verbatim package such that each line will automatically be broken. A bonus would be to indent all wrapped lines by a given amount, but I realize that the logic involved here is somewhat more complex.
\end{mycode}
\end{document}
相关问题
- 自动逐字换行只是提出建议
listings
,并没有解决问题verbatim
- 逐字环境可能会打断太长的行?这几乎满足了我的要求,但还不完全满足
答案1
我不确定这是你要找的东西,但它就在这儿。
\documentclass{article}
\usepackage{verbatim}
\makeatletter
\newenvironment{mycode}
{\def\@xobeysp{\ }\verbatim\rightskip=0pt plus 6em\relax}
{\endverbatim}
\makeatother
\begin{document}
\begin{mycode}
aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ } aaa { \ }
bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ } bbb { \ }
\end{mycode}
\end{document}