Разрыв строки в тексте

Разрыв строки в тексте

Я хотел бы, чтобы 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}

Использование seqsplit для разделения длинного текста.

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