
Я видел несколько вопросов вродеВот этоткоторые просят решение дляразбиение URL-адресов.
Интересно, можно ли расставлять переносы в словах в URL-адресе так же, как это делается в обычном тексте (т.е. разбивая слова с помощью механизма расстановки переносов)без добавления дефисова вместо этого специальный символ), см. пример 1.
- Указание перевода строки:Чтобы избежать неверной интерпретации URL-адреса с дефисом, я хотел бы видеть специальный символ, такой каквозврат кареткисимвол в позиции переноса.
- Дефисы и тире:Я не хочу, чтобы механизм расстановки переносов вставлял новые дефисы, которые могут быть неверно истолкованы как часть URL.
Если механизм расстановки переносов разрывает URL в позициибросаться(тире является частью URL), специальный символ должен быть вставлен в любом случае, см. пример 2.
- Если механизм расстановки переносов разрывает URL в позициислэш(косая черта является частью URL), специальный символ должен быть вставлен в любом случае, см. пример 3.
Требуемая расстановка переносов должна работать в абзацах, сносках и библиографии.
Примеры:
(1) http://www.w3.org/hypertext-transport-protocol/secure/test/appli↩
cationformular.html
(2) http://www.w3.org/hypertext-transport-↩
protocol/secure/test/applicationformular.html
(3) http://www.w3.org/hypertext-transport-protocol/secure/↩
test/applicationformular.html
Связанных с работой:
- Theрешение опубликовано Питером Грилломввел новую команду. Я хочу использовать существующую
\url
команду. Кроме того, его решение разрывает слова на каждом символе, в то время как я хочу положиться на решение движка переносов, используя правильные переносы.
решение1
Это работает для кодировок T1 и OT1, для других кодировок потребуется модификация (по сути, нужен какой-то невидимый символ для использования в качестве поддельного символа переноса)
Как можно увидеть, если разрыв не добавлен (первый пример), то стрелка не добавляется, или стрелки будут добавлены, если разрыв происходит после синтаксиса URL /
или .
(второй пример) или в точке переноса, например, example-ple (третий пример)
В опубликованном виде стрелки располагаются на правом поле. Если вы предпочитаете, чтобы они находились внутри текстового блока, удалите \rlap
значок \discretionary
.
Также, как указано в сообщении, \brkurl
в вопросе предлагается назвать команду \url
просто «глобально удалить», brk
если это необходимо.
\documentclass{article}
%\tracingonline1
%\showboxbreadth=200
%\showboxdepth=200
\begin{document}
\def\addurlspace#1{%
\ifx\relax#1%
\else
\ifx/#1\space\fi
\ifx.#1\space\fi
#1%
\ifx/#1\space\fi
\ifx.#1\space\fi
\expandafter\addurlspace
\fi}
\makeatletter
\@namedef{OT1-zwidthchar}{255}
\@namedef{T1-zwidthchar}{"17}
\def\brkurl#1{%
\edef\savedhchar{\the\hyphenchar\font}%
\global\setbox1\hbox{}%
\setbox0=\vbox{\hsize=2pt\rightskip=0pt plus 1fill
\hfuzz\maxdimen
\tracinglostchars0
\overfullrule0pt
\hyphenchar\font=\csname \f@encoding-zwidthchar\endcsname
\noindent \hskip0pt \addurlspace #1\relax
\par
\loop
\setbox4 \lastbox
\ifvoid4 \else
\global\setbox1\hbox{\unhbox4\unskip\unskip\discretionary{\hbox{\rlap{$\leftarrow$}}}{}{}\unhbox1}%
\unskip
\unskip
\unpenalty
\unskip
\repeat
}%
\unhbox1
\hyphenchar\font\savedhchar
\relax}
\makeatother
some text \brkurl{http://www.example.com/this/directory/here}
some text \brkurl{http://www.example.com/this/directory/here} some text
some text \brkurl{http://www.example.com/this/directory/here} some text
\end{document}