提供文字字符支持的软件包

提供文字字符支持的软件包

在继续之前,我想告诉读者,我知道通常不鼓励重新实现软件包已经支持的功能。

  • 自动逐字换行有一个可接受的答案,但未解决问题。答案建议使用listings
  • https://tex.stackexchange.com/a/14345/13552是对上述问题的回答,使用空格作为断点。这对许多应用程序都很有用,但并非所有应用程序都很有用(例如 HL7 消息,它不使用空格)。

提供文字字符支持的软件包

目标

我希望通过自己(部分)实践来获得答案并获得一些理解。最终,我想了解逐字文本中的换行是如何工作的。

  • verbatim支持分页符,但不支持换行符(编程术语中为换行)。我想利用该verbatim包来处理代码,但需要换行符。

  • 在阅读verbatimspverbatim文档之后,我了解到的定义\@xobeysp是目标宏用于实现空格处的中断。出于好玩和实际原因,我想自己实现该包的功能。在此过程中,我想了解文档中说我可以使用钩子来修改环境spverbatim是什么意思。verbatimverbatim\every@verbatim

  • 也许我可以使用2001/03/12 版\addto@hook<nameofhook>{commands to be added}第 4 页中提到的内容?verbatim

这两个软件包都有很好的文档。不过,我还是需要一点帮助才能克服困难。

verbatim我对允许换行的环境的想法

\verbatim@processline也许可以在一行中的字符总长度大约达到时插入代码来中断该行\textwidth

我对自定义环境的想法verbatim(不受支持的功能spverbatim),允许在空格处中断

verbatim2001/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}

相关问题

答案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}

在此处输入图片描述

相关内容