
Я хотел бы, чтобы latex разбивал длинный текст внутри \texttt{}
, который не содержит пробелов. В настоящее время текст просто выбегает за пределы страницы.
Документ latex генерируется из документа reStructureText (мне приходится использовать reStructuredText). Поэтому я предпочитаю не использовать эти решения:
- заменив
\texttt{}
на\path{}
или\url{}
(если только кто-нибудь не скажет мне, как заставить Docutils сделать это) - вставка
\allowbreak{}
мягких переносов (возможно, но это ухудшает читабельность документа reStructuredText)
Есть ли какая-то глобальная конфигурация в документе latex, которая может вызвать разрыв строк texttt? Есть ли другой хороший способ получить печатный документ, который показывает весь текст?
Вот минимальный пример для моей проблемы:
\documentclass[a4paper]{article}
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
\end{document}
Когда я пытаюсь создать PDF-файл (используя «pdflatex a.tex»), из «TranformerException» виден только «TranformerEx».
решение1
Кража ответа egreg наКак эмулировать перенос \url без использования пакета url?, где он переопределил \url
, я начинаю с того же переопределения, чтобы вместо этого переопределить \texttt
вместо \url
. В оригинальном воплощении egreg он допускал переносы строк на .
и /
символы.
Но можно добавить и другие символы точек останова, например, ниже я также создаю [
точку останова:
\documentclass[a4paper]{article}
\renewcommand{\texttt}[1]{%
\begingroup
\ttfamily
\begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
\begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
\begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
\catcode`/=\active\catcode`[=\active\catcode`.=\active
\scantokens{#1\noexpand}%
\endgroup
}
\usepackage{lipsum}
\begin{document}
\lipsum[4]
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
If an unrecoverable error occurs during the transformation, then a
\texttt{\$GLOBALS['TCA']['tt\_address']['feInterface']['fe\_admin\_fieldList']}
\end{document}
Если вам нужно использовать это решение в заголовках разделов или других местах, где выполняется запись и обратное чтение из файлов .aux, вам нужно будет заменить его \renewcommand
на \DeclareRobustCommand
— см. этот ответ для получения дополнительной информации:Объединение переноса \texttt{} с разделами и оглавлением — Неправильная буквенная константа
ДОБАВКА
Lemdan спрашивает (а Joey спрашивал давным-давно) в комментарии, как сделать так, чтобы подчеркивание стало _
точкой останова? Поскольку подчеркивание обычно имеет код catcode 8, нужно усвоить аргумент об \texttt
использовании вместо него кода catcode, _
установленного в 12. Конечно, это предотвратит использование индексов внутри math внутри \texttt
, но с этим не должно быть слишком сложно жить. Это также устранит необходимость экранирования подчеркиваний в \texttt
.
\documentclass[a4paper]{article}
\catcode`_=12 %
\renewcommand{\texttt}[1]{%
\begingroup
\ttfamily
\begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
\begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
\begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
\begingroup\lccode`~=`_\lowercase{\endgroup\def~}{_\discretionary{}{}{}}%
\catcode`/=\active\catcode`[=\active\catcode`.=\active\catcode`_=\active
\scantokens{#1\noexpand}%
\endgroup
}
\catcode`_=8 %
\usepackage{lipsum}
\begin{document}
\lipsum[4]
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
If an unrecoverable error occurs during the transformation, then a
\texttt{\$GLOBALS_'TCA']['tt_address']['feInterface']['fe_admin_fieldList']}
\end{document}
решение2
Исходя из ответа Стивена, в своем документе я использовал \texttt
рисунки для отображения путей и URL-адресов, но также я использовал их \texttt
в своем тексте для выделения небольших фрагментов кода.
Хотя код, предоставленный Стивеном, работает с моими рисунками, он все равно выходит за пределы полей при написании \texttt
команд для обычного текста, который не использует символы. Как показано на изображении ниже, \texttt
работает отлично для рисунков, но для обычного текста работает не очень хорошо.
Чтобы это исправить, я позаимствовал код для\justify
из этого поста tex.seи просто добавил это в существующий код.
\newcommand*\justify{%
\fontdimen2\font=0.4em% interword space
\fontdimen3\font=0.2em% interword stretch
\fontdimen4\font=0.1em% interword shrink
\fontdimen7\font=0.1em% extra space
\hyphenchar\font=`\-% allowing hyphenation
}
\renewcommand{\texttt}[1]{%
\begingroup
\ttfamily
\begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
\begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
\begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
\catcode`/=\active\catcode`[=\active\catcode`.=\active
\justify\scantokens{#1\noexpand}%
\endgroup
}
Это обеспечивает гораздо лучший результат и подходит для моего случая, когда я использую пишущую машинку в разных местах.
решение3
Я не уверен, насколько вы готовы пересмотреть преамбулу, но вот предложение:
\documentclass{article}
\begingroup
\catcode`\.=\active
\gdef.{\normalperiod\allowbreak}%
\endgroup
\newcommand\aepath[1]{%%
\bgroup
\let\normalperiod=.%%
\catcode`\.=\active
\everyeof{\noexpand}%%
\endlinechar=-1%%
\ttfamily\scantokens{#1}%%
\egroup}
\let\oldtexttt\texttt
\let\texttt\aepath
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
\end{document}
Из вашего MWE я предположил, что вы хотите, чтобы ваш код был разрываемым в точках, где .
встречается a. Предполагая, что все ситуации, в которых вы можете столкнуться с длинным текстом, включают такие .
разделенные имена и что вам это не нужно \texttt
для каких-либо других целей в вашем документе, это может быть решением для вас.
Если вы обеспокоены тем, что другой пакет может .
быть активным, но определен по-другому, вы можете воспользоваться следующим подходом:
\documentclass{article}
\begingroup
\catcode`\.=\active
\gdef\redefineperiod{\def.{\normalperiod\allowbreak}}%%
\endgroup
\newcommand\aepath[1]{%%
\bgroup
\let\normalperiod=.%%
\catcode`\.=\active
\redefineperiod
\everyeof{\noexpand}%%
\endlinechar=-1%%
\ttfamily\scantokens{#1}%%
\egroup}
\let\oldtexttt\texttt
\let\texttt\aepath
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown. Followed
by more text which is just to fill to the ned of the line.
\end{document}
Наивно (т.е. это то, что я изначально думал, что смогу сделать), вы можете попробовать
\documentclass{article}
\newcommand\aepath[1]{%%
\bgroup
\let\normalperiod=.%%
\catcode`\.=\active
\def.{\normalperiod\allowbreak}%%
\everyeof{\noexpand}%%
\endlinechar=-1%%
\ttfamily\scantokens{#1}%%
\egroup}
\let\oldtexttt\texttt
\let\texttt\aepath
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown. Followed
by more text which is just to fill to the ned of the line.
\end{document}
Но это не сработает, потому что точка после \def
уже токенизирована и не активна. Поэтому LaTeX выдаст ошибку об отсутствующей управляющей последовательности.
ОБНОВЛЯТЬ
Если вас не особенно беспокоит, где именно происходят разрывы, то вы можете использовать что-то вроде:
\documentclass{article}
\makeatletter
\newcommand\aepath[1]{%%
\bgroup
\ttfamily
\ae@path#1\relax\@nil
\egroup}
\def\ae@path#1#2\@nil{%%
\def\ae@continue{}%%
\detokenize{#1}\unskip\penalty\z@
\ifx\relax#2%%
\else
\def\ae@continue{\ae@path#2\@nil}%%
\fi
\ae@continue}
\makeatother
\let\texttt\aepath
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
\end{document}
хотя мне это кажется немного неоптимальным. Я думаю, было бы лучше решить, где должны быть точки останова, и следовать примеру, чтобы .
сделать эти символы (такие как /
, -
, и т. д.) активными символами в контексте команды и протащить штраф, чтобы разрешить остановку после них.
решение4
Это поздний ответ, но я опубликовал вопрос с ответомздесь, вот еще раз, дословно:
Используйте \seqsplit.
\documentclass[9pt,oneside]{amsart}
\usepackage{seqsplit}
\begin{document}
Filler text. Filler text. Filler text. Filler text. \seqsplit{0xcf416c536ec1a19ed1fb89e4ec7ffb3cf73aa413b3aa9b77d60e4fd81a4296ba}
\end{document}