Какие советы есть у людей для игры в гольф в TeX / LaTeX? Пожалуйста, оставьте один совет на каждый ответ, по крайней мере, в некоторой степени относящийся к TeX / LaTeX
Контекст: я заметил этот ответ и что у TeX / LaTeX нет вопросов с советами, поэтому я создаю этот. Есть некоторые совпадения с более узкими вопросами для игры в гольф в TikZ (так как TikZ - это особый макропакет поверх TeX / LaTeX): ответы на этот вопрос, вероятно, также будут применяться там, но не наоборот.
Ответы:
Рассмотрим внутренние макросы LaTeX, а не документированные
Например,
\roman
документированный макрос LaTeX, который работает на счетчиках LaTeX. Чтобы превратиться42
в,XLIV
вы должны использовать что-то вродеВместо этого, посмотрев, как
\roman
это реализовано (используйте,\show\roman
чтобы получить это в интерактивном режиме, вместо того, чтобы читать исходные файлы), можно увидеть, что это реализовано в терминах полезного макроса, который называется\@roman
, и вместо этого использовать его напрямую:\catcode`@11
это способ написания в гольфе\makeatletter
(чистый путь в LaTeX) или\catcode`\@=11
(чистый способ в простом TeX). Сначала нужно только один раз, после этого вы можете использовать имена макросов, содержащие@
.источник
~
может использоваться как макрос (как и другие активные символы)пример
До:
После:
Объяснение : Как правило, макросы в TeX являются «управляющими последовательностями»: вы можете определить
\something
или\a
. Но вы можете пойти еще короче, используя активный персонаж. Единственный активный символ, который присутствует по умолчанию (в простом TeX / LaTeX), это~
(используется для «связей», то есть определяется как\penalty \@M \
в простом TeX (штраф 10000 с пробелом) и как\nobreakspace {}
в LaTeX). Но ничто не мешает вам переопределить его для любой цели, в которой вы нуждаетесь.Далее : вы можете сделать то же самое с любым другим символом, установив его catcode в
\active
(13). Например, что делаетZ
активный характер имеет «стоимость» 12 байт:\catcode`Z13
. Тогда вы можете использовать простоZ
везде вместо макроса, как\z
. Для некоторых символов, которые начинаются со специального значения, подход прямого обратного удара не работает, и вам нужен еще один символ:\catcode`\Z13
или\catcode90=13
.источник
\def
может соответствовать фиксированным образцамДопустим, вы имели
\def\a #1 #2 {...some definition here...}
. Затем, когда вы вызываете его в строке типа\a Act42, Scene26
, внутри макроса аргументы могут быть назначены как # 1 <-Act42,
, # 2 <-Scene26
и тогда вам придется проделать дополнительную работу, чтобы извлечь соответствующие части. Вместо этого можно напрямую написатьа затем вызывать его так, как если
\a Act42, Scene26
бы он непосредственно устанавливал # 1 <-42
и # 2 <-26
.(Это в основном определение
\def
, но его легко забыть, так как в LaTeX обычно этого не делают, предпочитая передавать аргументы так,{}
как если бы они были вызовами функций.)источник
Выбор между простым TeX и LaTeX
Об этом можно много говорить, но вкратце, сравните типичный обычный документ TeX, который печатает «Hello», с типичным документом LaTeX для того же самого:
против
«Стоимость» LaTeX (по сравнению с гольфом) очевидна; «Преимущество», конечно, заключается в том, что LaTeX поставляется с библиотекой множества предварительно написанных макросов и пакетов, некоторые из которых могут быть полезны для выполнения поставленной задачи.
источник
\@Roman
того, что работа с заглавными буквами для работы в простом формате будет стоить много байтов, но обычный TeX часто будет короче.\input ...
короче чем\usepackage{...}
Например, вы можете написать
вместо того
что на 6 байтов меньше.
источник
\usepackage
становится более эффективным по мере увеличения количества включаемых пакетов. Поскольку вы можете использовать более одного пакета только с одним\usepackage
оператором, но требовать\input
для каждого пакета, если вы используете 3 или более пакетов, это\usepackage
станет лучшим вариантом.Если вы используете LaTeX, используйте короткий
documentclass
(идея Chris H )Вместо того, чтобы начать с типичного
можно выбрать более короткие классы документов, такие как
book
или дажеили
источник
article
по умолчанию нумерация его страниц, это можно считать дополнительным выводом. Возможно, мета вопрос для того, чтобы определить, какие классы документов должны быть разрешены.g.cls
который простоarticle.cls
с,\pagenumbering{gobble}
но так как github не работает, я не могу сейчас его поднятьg.cls
Создание среды с именем
myenvironment
генерирует команды\myenvironment
и\endmyenvironment
. Они используются внутри, чтобы начинать и заканчивать среду. В некоторых случаях их можно использовать как ярлыки. Например, вместоможно сделать
Не поддерживается, не надежен, не работает во всех случаях, используйте на свой страх и риск и т. Д.
источник
\itemize{...}
для еще большей экономии.\usepackage{packagea,packageb,packagec}
работает, пока вы не передаете опции пакетам.источник
Выполнить линии вместе. Разрывы строк редко требуются в LaTeX / TeX по сравнению со многими языками с расширенными формами.
источник
Некоторые макросы, которые вы, возможно, ожидаете, требуют скобок вокруг своих аргументов, на самом деле их нет, особенно когда они используются внутри другого макроса с
#1
аргументами -style.Большинству макросов нужны только фигурные скобки, если в аргументе содержится более одного токена (символьная или управляющая последовательность).
источник
Если вам нужно использовать один и тот же макрос с длинным именем несколько раз, вы можете использовать
\let
для определения более короткого псевдонима.Это позволяет сэкономить два байта
\def\a{\mymacrowithalongname}
, если вам не нужны несколько токенов в определении.Вместо имени макроса у вас может быть активный символ для сохранения на обратной косой черте.
Обратите внимание, что это
\let
работает не только с именами макросов, но и со встроенными примитивами. Например, если вы используете много\ifnum ... \fi
конструкций в своем коде, определение\let\i\ifnum
и использование вместо этого\i ... \fi
может сэкономить вам несколько байтов. Это даже работает для\let
себя\let\l\let
.источник
Используйте местные
{
...}
группы с умомКак указано в этом ответе , активные символы наподобие
~
могут использоваться в качестве имени макроса. К сожалению,~
по умолчанию является единственным активным символом, и изменение кода для другого символа стоит дорого:\catcode`!13
занимает 12 байт. Если новое определение макроса необходимо только в небольшой области вашего кода, локальные группы могут быть решением.Когда TeX входит в новую открытую локальную группу
{
, он создает новый уровень группировки во внутреннем стеке сохранения. Это означает, что все текущие макросы и регистры сохранены. Любые изменения к ним (если явно не помечены как\global
) теперь активны только до тех пор, пока группа не будет закрыта}
. Это означает, что~
его можно переопределить в группе, использовать там с новым определением, а старое определение будет автоматически восстановлено после завершения группы.Вот пример:
Это выводы
Интересным побочным эффектом этого механизма группировки является то, что старые значения по-прежнему доступны внутри группы, пока они там не будут изменены. Чтобы проиллюстрировать это, представьте, что мы хотим напечатать количество символов на основе значения счетчика, дополнить их пробелами до фиксированной длины и продолжить с исходным значением счетчика. Это может быть достигнуто следующим:
какие выводы
Такое групповое поведение особенно важно, если вы хотите использовать стандартные макросы TeX для циклических
\loop ... \repeat
вложений. Эти макросы определяют внутренние команды и используют их для определения дальнейших действий. Вложение их без помещения внутреннего цикла в фигурные скобки приведет к путанице во внутренних командах и приведет к неожиданному поведению.источник
Продвижение счетчиков, таких как
также работать как
Тот же принцип работает и для инициализации:
устанавливает счетчик \ u в 1.
Обратите внимание, что для них нужен символ пробела (разрыв строки или пробел) после них (или a
\relax
, но пробел делает то же самое), поэтому следующая команда не будет проигнорирована. Например,НЕ печатает \ u, но игнорирует
\the
команду.источник
\enddocument
вместо того, чтобы\end{document}
сохранить два символаисточник
\begin{document}
=>\document
хотя