![在所有情况下都允许在斜线后换行,而无需使用宏](https://linux22.com/image/423504/%E5%9C%A8%E6%89%80%E6%9C%89%E6%83%85%E5%86%B5%E4%B8%8B%E9%83%BD%E5%85%81%E8%AE%B8%E5%9C%A8%E6%96%9C%E7%BA%BF%E5%90%8E%E6%8D%A2%E8%A1%8C%EF%BC%8C%E8%80%8C%E6%97%A0%E9%9C%80%E4%BD%BF%E7%94%A8%E5%AE%8F.png)
我正在用 排版表格longtable
。我有一p{2in}
列。列中有文件名。有时这些文件名很长。它们中间有斜线。有点像/home/user/somebody/project1/file1/subfile1/this-is-the-filename.txt
。有什么方法可以告诉 LaTeX 允许在斜线后换行吗?
答案1
假设您的列中的其他上下文中没有斜线,您可以执行以下操作:
\makeatletter
{\catcode`\/=\active
\gdef\slashbreak{
\catcode`\/=\active
\def/{\char`\/\penalty\z@}}
}
\makeatother
...
\begin{slashbreak}
\begin{longtable}
...
\end{longtable}
\end{slashbreak}
这将会/
在 slashbreak 环境中创建一个活动角色,以便它的任何实例之后都允许中断。
为什么这样做
在 TeX 中操作字符代码可能很棘手——字符的字符代码将是其被消化时的代码,这不一定是您所期望的。如果我们省略周围的括号和类别代码的设置,/
当我们尝试重新定义时,我们会得到一个缺失的控制序列,/
因为类别代码将是 12 而不是 13。这也是为什么,例如,\verb
对类别代码进行全面更改,却在另一个命令的参数中不起作用的原因:这些更改发生得太晚,以至于逐字模式无法工作,因为原始类别代码是在 TeX 最终扩展宏时建立的\verb
。
我们在这里使用的习惯用法是更改组内的类别代码并执行\gdef
(简称\global\def
以便定义可在组外访问),这是此类类别代码操作的典型做法。如果您深入研究 LaTeX 源代码,您会看到很多类似的编码。