Как установить штраф и ширину внутреннего пространства внутри немецких аббревиатур, включая атрибуты растяжения и сжатия?

Как установить штраф и ширину внутреннего пространства внутри немецких аббревиатур, включая атрибуты растяжения и сжатия?

ПродолжаяКак автоматически расставлять пробелы в аббревиатурах (на немецком языке)иhttp://tex.stackexchange.com/a/134856, некоторые из нас склонны набирать обычный или тонкий пробел в сокращениях и писать, например,

d.\@ h, d.\ h., d.\,h., z.\@ B, z.\ B, z.\,B.

Хотя DIN 5008:2011 (теперь заменен; может кто-нибудь посмотреть обновление?) набирает там обычный неразрывный пробел, вообще не упоминая никаких изменений ширины, пример, который z.°B.они приводят, набран моноширинным шрифтом. Однако гораздо чаще мы используем пропорциональный шрифт, поэтому мы, вероятно, также посчитали бы более приятным (как и многие люди здесь, в TeX.SE) немного уменьшить ширину неразрывного пробела внутри аббревиатуры. Некоторые говорят, что она должна быть вдвое меньше обычной ширины пробела; ср.http://www.master-bachelor-korrektur.de/abstaende.php.

Используя cmr10 с длиной пробела 3,33pt, мы получаем

d.\kern1.665pt h., z.\kern1.665pt B.,

что достаточно близко к

d.\kern.16667em h., z.\kern.16667em B.

или

d.\,h., z.\,B.

в текстовом режиме. Вы можете также взять какое-либо другое значение в интервале [min{тонкий пробел, полупространство}, обычный пробел[, если вы предпочитаете быть ближе к DIN5008:2011; точное значение, вероятно, не имеет большого значения для сути вопроса.

Теперь, когда набор текста действительномноготекста, вы рано или поздно столкнетесь с двумя проблемами:

А. с фиксированной шириной\kernчисло, ваши сокращения иногда выглядят слишком широкими или слишком узкими по сравнению с остальной частью строки, и

B. В узких колонках иногда хочется избежать выхода текста на правое поле или на последнюю строку абзаца, которая в итоге оказывается слишком пустой, или нежелательного переноса слов в других местах абзаца.

Проблему А можно решить, добавив компоненты растяжения и сжатия в пространство внутри аббревиатуры, а проблему Б — введя немаксимальный штраф:

d.\penalty5000\hskip.16667em plus.08333em minus.08333em h., z.\penalty5000\hskip.16667em plus.08333em minus.08333em B.

Это поднимает два вопроса:

  1. Выше 5000 — это значение, взятое из ниоткуда, оно составляет 50 % от , \@Mи мы не можем объяснить, почему оно равно \@M/2, а не \@M/3 или 2 \@M/3 или просто 1. Какое было бы хорошим общим значением или диапазоном значений (меньше, чем мое текущее предположение, которое представляет собой интервал [1, 9999]) для штрафа?

  2. Выше мы взяли примерно 50 % естественной ширины для атрибутов растяжения и сжатия. Опять же, 1/2 взято из ниоткуда — это могло быть любое другое значение в ]0,1[, например 1/3 или 2/3. Есть ли более обоснованные варианты для процентов для атрибутов растяжения и сжатия?

Независимо от этого и следуя комментарию ДэвидаНужно ли проявлять особую осторожность, если за точкой внутри аббревиатуры следует \hskip или \hspace?, мы хотели бы избежать абсолютных значений в pt или em, и вместо этого мы хотели бы использовать значения относительно размеров шрифта, связанных с пробелами. Таким образом:

  1. Как выразить
\hskip.5*\fontdimen2 plus.5\fontdimen3 minus.5\fontdimen4

в LaTeX правильно? Конечно, если вам не нравится 1/2, смело берите какой-нибудь другой процент, при условии, что у вас есть для этого хорошее объяснение. В качестве альтернативы вы можете взять другие линейные комбинации \fontdimen2, \fontdimen3, и \fontdimen4для трех параметров, если вы чувствуете необходимость и можете это объяснить.

решение1


Для 3

\fontdimenпринимает два аргумента: номер параметра и шрифт, из которого следует взять параметр. \fontвозвращает текущий шрифт, поэтому\hskip.5\fontdimen2\font plus.5\fontdimen3\font minus.5\fontdimen4\font


Для 1

это зависит от того, что вы пытаетесь предотвратить, добавляя штраф. TeX попытается найти разрывы строк, чтобы минимизировать общую неисправность, поэтому значение в этой точке нельзя рассматривать изолированно, вам нужно учесть, что произойдет, если разрыв строки не будет выполнен там, обычно некоторые пробелы растягиваются, чтобы обеспечить неоптимальную точку останова, так что растяжение повлечет за собой значение неисправности, и вам нужно сделать штраф за разрыв вашей аббревиатуры больше, чем штраф за растяжение пробела, чтобы штраф имел эффект.

введите описание изображения здесь

В первом тесте вы видите, что брейкпоинт между !!довольно легко обойти. Он принимается, если штраф равен 10, но штраф в 20 уже достаточен, чтобы предотвратить брейк в этой точке.

Во втором тесте избежать поломки в этой точке сложнее, даже максимального штрафа без принуждения в размере 9999 недостаточно.

Поэтому нет определенных правил, по которым вам нужно выбирать, что именно вы хотите предотвратить и в какой степени вы готовы терпеть вред, создаваемый неоптимальными альтернативами.

\documentclass{article}

\begin{document}
3) \hskip.5\fontdimen2\font plus.5\fontdimen3\font minus.5\fontdimen4\font X

\noindent X\dotfill X

\def\test#1{\par$#1$\par
  aaaaaaaaaaaaaaaaaaaaaaaaaaaa aaa a a a a a a4 a a a a a a a7 a a a a 8 aa!\penalty#1\,! bbb}

\test{-10000}
\test{10000}
\test{20}
\test{10}
\test{00}



\noindent X\dotfill X

\def\test#1{\par$#1$\par
  aaaaaaaaaaaaaaaaaaaaaaaaaaaa aa aaa aaa aa aa aaaaaaaaaaaaaaaaaa7  aa!\penalty#1\,!bbb bbbbbb}

\test{-10000}
\test{10000}
\test{9999}
\end{document}

Для 2

это немного зависит от культурных ожиданий пунктуации сокращений, но я бы, вероятно, позволил меньше сжиматься, чем растягиваться. Пробел и так узкий, поэтому в плотных строках, если вы позволите ему сократиться вдвое, он может фактически выглядеть как отсутствие пробела вообще. Будет ли AB выглядеть правильно без явно видимого пробела, зависит от того, как вы (или ваши читатели) ожидаете, что он будет выглядеть.

решение2

Я не думаю, что вам нужен перенос строки в середине такого сокращения, что было бы возможно с \penalty5000.

Единообразия можно добиться с помощью команды:

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\abk}{m}
 {
  \tl_head:n { #1 } % the first letter
  \exp_args:Ne \tl_map_function:nN { \tl_tail:n { #1 } } \aim_add_space:n
  .\@
 }

\cs_new_protected:Nn \aim_add_space:n
 {
  .\@\nolinebreak
  \skip_horizontal:n { ( \fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font)*2/3 }
  #1
 }

\ExplSyntaxOff

\begin{document}

\abk{dh}
\abk{zB}

\abk{wxyz}

\makebox{word word \abk{zB} word word}

\makebox[1.3\width][s]{word word \abk{zB} word word}

\makebox[0.95\width][s]{word word \abk{zB} word word}

\end{document}

Здесь нормальный межсловный интервал сокращается до 2/3 с помощью выражения пропуска. Поэкспериментируйте с коэффициентом.

введите описание изображения здесь

Для полноты команда может проверить, \spaceskipявляется ли число ненулевым, и использовать его в случае, если это так.

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\abk}{m}
 {
  \tl_head:n { #1 } % the first letter
  \exp_args:Ne \tl_map_function:nN { \tl_tail:n { #1 } } \aim_add_space:n
  .\@
 }

\cs_new_protected:Nn \aim_add_space:n
 {
  .\@\nolinebreak
  \dim_compare:nTF { \spaceskip > 0pt }
   { 
    \skip_horizontal:n { \spaceskip*2/3 }
   }
   { 
    \skip_horizontal:n { (\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font)*2/3 }
   }
  #1
 }

\ExplSyntaxOff

\begin{document}

\abk{dh}
\abk{zB}

\abk{wxyz}

\makebox{word word \abk{zB} word word}

\makebox[1.3\width][s]{word word \abk{zB} word word}

\makebox[0.95\width][s]{word word \abk{zB} word word}

\setlength{\spaceskip}{1em plus 1em minus 0.5em}

\makebox{word word \abk{zB} word word}

\makebox[1.3\width][s]{word word \abk{zB} word word}

\makebox[0.95\width][s]{word word \abk{zB} word word}

\end{document}

введите описание изображения здесь

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