Красиво заставьте 66 символов в строке

Красиво заставьте 66 символов в строке

Мне бы хотелось иметь «что-то» (пакет, трюк, макрос, ...?), что позволило бы мне удобно играть с полями (или макетом), чтобы задать среднее или типичное количество символов в строке.

В идеале эта «система» помогла бы мне сохранить это соотношение (66, 2,5 алфавита или любое другое число, которое я выберу/введу) независимо от изменений в семействах шрифтов (например, при использовании пакета pslatexили txfonts), в размерах шрифтов (например, с помощью параметра 10ptили 12ptкласса).

Я немного осмотрелся и понял, что использование классов KOMA-Script или memoirкласса может быть частью решения, хотя я бы предпочел этого не делать (тем более, что я до сих пор ни одним из них не пользовался).

Для меня важным моментом является то, что все пропорции или принципы исходного макета должны быть сохранены. Например, если бы было заданное соотношение между левым и правым полями, то просто игра с одним полем или с textwidth/linewidth меня бы не удовлетворила.

Почему я хочу это сделать? Потому что мне нравится использовать пакет pslatex, но это увеличивает среднее количество символов в строке с 65 без него до 75+ с ним.

Обратите внимание, я уже прочитал или просмотрел:

И, возможно, там есть ответы, но мне не удалось (слишком легко) их найти.

решение1

Утверждение о 2,5-кратной длине строчной буквы — это всего лишь указание. Однако вы можете поиграть с geometry:

\documentclass{book}

%%\usepackage{newtxtext}
\newlength{\alphabet}
\settowidth{\alphabet}{\normalfont abcdefghijklmnopqrstuvwxyz}

\usepackage{geometry}
\geometry{textwidth=2.5\alphabet,hmarginratio={2:3}}

\begin{document}
\the\textwidth
\end{document}

Это будет использовать указанное соотношение для полей (2:3 на самом деле является значением по умолчанию в двухстороннем режиме). Правильно настроенные пакеты шрифтов должны работать правильно.

Со шрифтами по умолчанию я получаю ширину текста 318,96 пунктов, а с newtxtext— 298,58 пунктов ( mathptmxрезультат — 298,57 пунктов).

Обратите внимание, что pslatexэто очень устаревший пакет и что его потомок mathptmxне подходит для серьезного набора текста, связанного с математикой. Если вам не нужна математика, другие варианты на основе (Linotype) Times Roman

  • newtxtext(на основе txfonts, но с исправленными показателями)

  • tgtermes

В комплект первой версии входит сопутствующий математический пакет newtxmath.

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

\geometry{textwidth=2.5\alphabet}
\makeatletter
\if@twoside
  \geometry{hmarginratio={2:3}}
\else
  \geometry{hmarginratio={1:1}}
\fi
\makeatother

можно использовать. Опции для geometryможно задать в отдельных \geometryкомандах. Не забудьте указать размер бумаги (это можно сделать либо в \geometryопции класса, либо в качестве опции класса).

Вы также можете протестировать загруженный класс:

\makeatletter
\geometry{hmarginratio={1:1}} % fallback

\@ifclassloaded{book}
 {
  \if@twoside
    \geometry{hmarginratio={2:3}}
  \else
    \geometry{hmarginratio={1:1}}
  \fi
 }{}

\@ifclassloaded{article}
 {
  \if@twoside
    \geometry{hmarginratio={4:2}}
  \else
    \geometry{hmarginratio={1:1}}
  \fi
 }{}
\makeatletter

(настройка 4:2 приведена просто в качестве примера).

Однако универсального формата не существует: то, что вы в конечном итоге выберете для документа, зависит от самого документа.


Как установить горизонтальное отношение полей, равное фиксированному классом? Это немного сложно, поскольку стандартная настройка использует другую модель, чем geometry.

\documentclass{article}
\usepackage{newtxtext}
\usepackage{geometry}

\newlength{\alphabet}
\sbox0{\normalfont abcdefghijklmnopqrstuvwxyz}
\setlength{\alphabet}{\wd0}

\makeatletter
\begingroup
\dimendef\innermargin=\z@
\dimendef\outermargin=\tw@
\innermargin=\dimexpr\oddsidemargin+1in+\hoffset\relax
\outermargin=\dimexpr\paperwidth-\innermargin-\textwidth\relax
\outermargin=.002\outermargin
\innermargin=2\innermargin
\count@=\innermargin
\divide\count@ \outermargin
\xdef\standardhmarginratio{\number\count@:1000}
\endgroup

\geometry{textwidth=2.5\alphabet,hmarginratio=\standardhmarginratio}

\begin{document}

text width = \the\textwidth

horizontal margin ratio = \standardhmarginratio

\end{document}

С articleклассом мы получаем 1000:1000, с book(двусторонним режимом) результат равен 667:1000, то есть, для всех практических целей, 2:3.

решение2

Роберт Брингхерст, в«Элементы типографского стиля», дает таблицу предпочтительных длин строк для разных шрифтов. Оптимизация наименьших квадратов данных таблицы показала, что ее можно довольно хорошо аппроксимировать с помощью следующего макроса:

\newcommand*\GetTextWidth[3][\normalfont]{{#1%
    \settowidth{#2}{abcdefghijklmnopqrstuvwxyz}%
    \setlength{#2}{0.03193#2}%
    \addtolength{#2}{0.44961pt}%
    \setlength{#2}{#3#2}%
    \global#2=#2}}

Который может использоваться вместе с geometryи т. д. для установки ширины текста

\newlength\bringhurstwdt
\GetTextWidth{\bringhurstwdt}{66}
\geometry{textwidth=\bringhurstwdt}

Я предполагаю, что это справедливо для стандартного английского, в котором есть относительно короткие слова. В таком языке, как африкаанс (мой родной язык), у нас много очень длинных слов, и 66 символов в строке не всегда выглядят правильно. Для других языков количество символов для хорошей типографики может отличаться, но я понятия не имею, что будет лучше.

решение3

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

 \input lang-frq.mkii %macros to calculate average length
 \input lang-frd.mkii %language frequency tables

 \setuplayout[width=66\averagecharwidth]

Видетьlang-frd.mkiiдля таблиц частотности языка иlang-frq.mkiiдля макросов для расчета средней ширины. Из документации:

Этот модуль реализует метод определения ширины среднего символа в языке. Он использует размеры текущих шрифтов.

Метод~1 игнорирует ширину и предполагает, что каждый символ имеет ширину .5em, что верно для большинства моноширинных шрифтов. Метод~2 берет x в качестве отправной точки и предполагает, что его высота в некотором роде соответствует его ширине. Метод~3 является лучшим и определяет среднюю ширину на основе таблицы символов, специфичной для языка. Метод~4 представляет собой смесь первых двух методов: специфичная для символов ширина, применяемая к равномерному распределению. Метод~0 сообщает общее количество, которое обычно составляет ~100.

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

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

Хотя файлы имеют .mkiiрасширение, код довольно низкоуровневый TeX и работает также с ConTeXt MkIV. Он также должен работать с LaTeX с небольшими изменениями.

Для получения действительно «среднего значения в 66 символов на строку» вы можете сначала предварительно обработать текст, чтобы сгенерировать таблицу частот, а затем использовать эту таблицу частот для вычисления средней ширины символа!

Примечание: \averagecharwidthМакрос берет размеры шрифта из текущего шрифта и выбирает частоту символов из текущего языка. Поэтому его следует использовать после того, как были указаны шрифт и язык документа.

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