Поради щодо гольфу в 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). Але ніщо не заважає вам переосмислити його з будь-якою метою.

Далі : ви можете зробити те ж саме з будь-яким іншим символом, встановивши його кодовий код на \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, який друкує "Привіт" з типовим документом LaTeX для того ж:

Hello
\bye

проти

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

«Вартість» LaTeX (wrt-код гольфу) очевидна; "користь" звичайно полягає в тому, що 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

Я вважаю, що мінімальний клас був би хорошою ідеєю - назва однієї літери та без нумерації сторінок
Кріс Х

Я зібрав 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 пробілів і продовжуйте використовувати х = 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.

Зауважте, що для них потрібен символ пробілу (рядок рядка або пробіл) після них (або а \relax, але пробіл робить те саме), щоб наступна команда не була проігнорована. Наприклад,

\u1\the\u

НЕ друкує \ u, але ігнорує \theкоманду.


1

\enddocumentзамість \end{document}збереження двох символів


Чи не схоже на роботу для \begin{document}=> \documentхоча
SHESS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.