
Я набираю таблицы с помощью 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, так что любой его экземпляр впоследствии позволит сделать break.
Почему это сделано именно так
Манипулирование кодами символов может быть сложным в TeX — код символа для символа будет кодом, когда он будет усваиваться, что не обязательно то, что вы могли бы ожидать. Если бы мы опустили окружающие скобки и установку кода категории /
, мы бы получили отсутствующую управляющую последовательность при попытке переопределения, /
поскольку код категории был бы 12, а не 13. Это также причина того, почему, например, \verb
которая делает массовые изменения кодов категорий, не работает в аргументе другой команды: эти изменения происходят слишком поздно для работы режима дословности, поскольку исходные коды категорий устанавливаются, когда TeX наконец расширяет макрос \verb
.
Идиома, которую мы здесь использовали, изменение кода категории внутри группы и выполнение \gdef
(сокращение от \global\def
так, чтобы определение было доступно за пределами группы) типична для такого рода манипуляций с кодом категории. Если вы покопаетесь в исходном коде LaTeX, вы увидите, что происходит много похожего кодирования.