Разрешить перенос строки после косой черты во всех случаях без необходимости использования макроса

Разрешить перенос строки после косой черты во всех случаях без необходимости использования макроса

Я набираю таблицы с помощью 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, вы увидите, что происходит много похожего кодирования.

Связанный контент