Советы по игре в гольф в TeX / LaTeX


28

Какие советы есть у людей для игры в гольф в TeX / LaTeX? Пожалуйста, оставьте один совет на каждый ответ, по крайней мере, в некоторой степени относящийся к TeX / LaTeX


Контекст: я заметил этот ответ и что у TeX / LaTeX нет вопросов с советами, поэтому я создаю этот. Есть некоторые совпадения с более узкими вопросами для игры в гольф в TikZ (так как TikZ - это особый макропакет поверх TeX / LaTeX): ответы на этот вопрос, вероятно, также будут применяться там, но не наоборот.


Как вы можете играть в гольф на языке без программирования?
Великая утка

1
@TheGreatDuck Очень плохо :-)
ShreevatsaR

@TheGreatDuck На самом деле TeX - это язык программирования, даже если обычно он используется только как типографский.
gvgramazio

Ответы:


15

Рассмотрим внутренние макросы LaTeX, а не документированные

Например, \romanдокументированный макрос LaTeX, который работает на счетчиках LaTeX. Чтобы превратиться 42в, XLIVвы должны использовать что-то вроде

\newcounter{z}
\setcounter{z}{42}
\roman{z}

Вместо этого, посмотрев, как \romanэто реализовано (используйте, \show\romanчтобы получить это в интерактивном режиме, вместо того, чтобы читать исходные файлы), можно увидеть, что это реализовано в терминах полезного макроса, который называется \@roman, и вместо этого использовать его напрямую:

\catcode`@11
\@roman{42}

\catcode`@11это способ написания в гольфе \makeatletter(чистый путь в LaTeX) или \catcode`\@=11(чистый способ в простом TeX). Сначала нужно только один раз, после этого вы можете использовать имена макросов, содержащие @.


13

~может использоваться как макрос (как и другие активные символы)

пример

До:

\def\a{...some definition...} ... use \a...

После:

\def~{...some definition...} ... use ~...

Объяснение : Как правило, макросы в TeX являются «управляющими последовательностями»: вы можете определить \somethingили \a. Но вы можете пойти еще короче, используя активный персонаж. Единственный активный символ, который присутствует по умолчанию (в простом TeX / LaTeX), это ~(используется для «связей», то есть определяется как \penalty \@M \в простом TeX (штраф 10000 с пробелом) и как \nobreakspace {}в LaTeX). Но ничто не мешает вам переопределить его для любой цели, в которой вы нуждаетесь.

Далее : вы можете сделать то же самое с любым другим символом, установив его catcode в \active(13). Например, что делает Zактивный характер имеет «стоимость» 12 байт: \catcode`Z13. Тогда вы можете использовать просто Zвезде вместо макроса, как \z. Для некоторых символов, которые начинаются со специального значения, подход прямого обратного удара не работает, и вам нужен еще один символ: \catcode`\Z13или \catcode90=13.


9

\def может соответствовать фиксированным образцам

Допустим, вы имели \def\a #1 #2 {...some definition here...}. Затем, когда вы вызываете его в строке типа \a Act42, Scene26, внутри макроса аргументы могут быть назначены как # 1 <- Act42,, # 2 <- Scene26и тогда вам придется проделать дополнительную работу, чтобы извлечь соответствующие части. Вместо этого можно напрямую написать

\def\a Act#1, Scene#2 {...some definition here...}

а затем вызывать его так, как если \a Act42, Scene26бы он непосредственно устанавливал # 1 <- 42и # 2 <- 26.

(Это в основном определение \def, но его легко забыть, так как в LaTeX обычно этого не делают, предпочитая передавать аргументы так, {}как если бы они были вызовами функций.)


8

Выбор между простым TeX и LaTeX

Об этом можно много говорить, но вкратце, сравните типичный обычный документ TeX, который печатает «Hello», с типичным документом LaTeX для того же самого:

Hello
\bye

против

\documentclass{article}
\begin{document}
Hello
\end{document}

«Стоимость» LaTeX (по сравнению с гольфом) очевидна; «Преимущество», конечно, заключается в том, что LaTeX поставляется с библиотекой множества предварительно написанных макросов и пакетов, некоторые из которых могут быть полезны для выполнения поставленной задачи.


Я застрял в использовании LaTeX из-за \@Romanтого, что работа с заглавными буквами для работы в простом формате будет стоить много байтов, но обычный TeX часто будет короче.
Крис Х

8

\input ... короче чем \usepackage{...}

Например, вы можете написать

\input color

вместо того

\usepackage{color}

что на 6 байтов меньше.


8
Однако полезно отметить, что это \usepackageстановится более эффективным по мере увеличения количества включаемых пакетов. Поскольку вы можете использовать более одного пакета только с одним \usepackageоператором, но требовать \inputдля каждого пакета, если вы используете 3 или более пакетов, это \usepackageстанет лучшим вариантом.
Пшеничный волшебник

7

Если вы используете LaTeX, используйте короткийdocumentclass (идея Chris H )

Вместо того, чтобы начать с типичного

\documentclass{article}

можно выбрать более короткие классы документов, такие как bookили даже

\documentclass{ecv}

или

\documentclass{tui}

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

@WheatWizard Хороший вопрос. Я думаю, что это может быть до отдельного вопроса, считаются ли номера страниц дополнительным выводом.
ShreevatsaR

Я считаю, что минимальный класс был бы хорошей идеей - имя из одной буквы и отсутствие нумерации страниц
Крис Х

Я собрал a, g.clsкоторый просто article.clsс, \pagenumbering{gobble}но так как github не работает, я не могу сейчас его поднять
Chris H


7

Создание среды с именем myenvironmentгенерирует команды \myenvironmentи \endmyenvironment. Они используются внутри, чтобы начинать и заканчивать среду. В некоторых случаях их можно использовать как ярлыки. Например, вместо

\begin{itemize}
\item abc
\end{itemize}

можно сделать

\itemize
\item abc
\enditemize

Не поддерживается, не надежен, не работает во всех случаях, используйте на свой страх и риск и т. Д.


Добро пожаловать на сайт!
DJMcMayhem

3
Вы часто можете сделать \itemize{...}для еще большей экономии.
Пшеничный волшебник

4

\usepackage{packagea,packageb,packagec} работает, пока вы не передаете опции пакетам.


4

Выполнить линии вместе. Разрывы строк редко требуются в LaTeX / TeX по сравнению со многими языками с расширенными формами.


3

Некоторые макросы, которые вы, возможно, ожидаете, требуют скобок вокруг своих аргументов, на самом деле их нет, особенно когда они используются внутри другого макроса с #1аргументами -style.

Большинству макросов нужны только фигурные скобки, если в аргументе содержится более одного токена (символьная или управляющая последовательность).

\mymacro1          % equivalent to \mymacro{1}
\mymacro{12}       % equivalent to \mymacro{12}
\mymacro a         % equivalent to \mymacro{a}
\mymacro{ab}       % equivalent to \mymacro{ab}
\mymacro\foo       % equivalent to \mymacro{\foo}
\mymacro{\foo x}   % equivalent to \mymacro{\foo x}

3

Если вам нужно использовать один и тот же макрос с длинным именем несколько раз, вы можете использовать \letдля определения более короткого псевдонима.

\let\a\mymacrowithalongname
\a{foo}\a{bar}\a{qux}

Это позволяет сэкономить два байта \def\a{\mymacrowithalongname}, если вам не нужны несколько токенов в определении.

Вместо имени макроса у вас может быть активный символ для сохранения на обратной косой черте.

Обратите внимание, что это \letработает не только с именами макросов, но и со встроенными примитивами. Например, если вы используете много \ifnum ... \fiконструкций в своем коде, определение \let\i\ifnumи использование вместо этого \i ... \fiможет сэкономить вам несколько байтов. Это даже работает для \letсебя \let\l\let.


3

Используйте местные {... }группы с умом

Как указано в этом ответе , активные символы наподобие ~могут использоваться в качестве имени макроса. К сожалению, ~по умолчанию является единственным активным символом, и изменение кода для другого символа стоит дорого: \catcode`!13занимает 12 байт. Если новое определение макроса необходимо только в небольшой области вашего кода, локальные группы могут быть решением.

Когда TeX входит в новую открытую локальную группу {, он создает новый уровень группировки во внутреннем стеке сохранения. Это означает, что все текущие макросы и регистры сохранены. Любые изменения к ним (если явно не помечены как \global) теперь активны только до тех пор, пока группа не будет закрыта }. Это означает, что ~его можно переопределить в группе, использовать там с новым определением, а старое определение будет автоматически восстановлено после завершения группы.

Вот пример:

\def~{abc}
~ -- {\def~{123}~} -- ~

Это выводы

ABC - 123 - ABC

Интересным побочным эффектом этого механизма группировки является то, что старые значения по-прежнему доступны внутри группы, пока они там не будут изменены. Чтобы проиллюстрировать это, представьте, что мы хотим напечатать количество символов на основе значения счетчика, дополнить их пробелами до фиксированной длины и продолжить с исходным значением счетчика. Это может быть достигнуто следующим:

\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.

какие выводы

Напечатайте символ 3 раза, добавьте 7 пробелов и продолжайте с x = 3.

Такое групповое поведение особенно важно, если вы хотите использовать стандартные макросы TeX для циклических \loop ... \repeatвложений. Эти макросы определяют внутренние команды и используют их для определения дальнейших действий. Вложение их без помещения внутреннего цикла в фигурные скобки приведет к путанице во внутренних командах и приведет к неожиданному поведению.


1

Продвижение счетчиков, таких как

\advance\u by 1
\multiply\u by 3
\divide\u by 2

также работать как

\advance\u1        % \u = \u + 1
\advance\u-1       % \u = \u - 1
\multiply\u3       % \u = \u * 3
\multiply\u\u      % \u = \u * \u
\divide\u2         % \u = \u / 2

Тот же принцип работает и для инициализации:

\newcount\u\u1

устанавливает счетчик \ u в 1.

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

\u1\the\u

НЕ печатает \ u, но игнорирует \theкоманду.


1

\enddocumentвместо того, чтобы \end{document}сохранить два символа


Кажется, не работает для \begin{document}=> \documentхотя
она
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.