Jakie wskazówki mają ludzie w golfa w TeX / LaTeX? Proszę zamieścić jedną wskazówkę na odpowiedź, każda przynajmniej nieco specyficzna dla TeX / LaTeX.
Kontekst: Zauważyłem tę odpowiedź i nie ma pytania dotyczącego wskazówek dla TeX / LaTeX, więc tworzę tę. Węższe wskazówki dotyczące gry w golfa w TikZ pokrywają się (ponieważ TikZ jest specjalnym pakietem makr na TeX / LaTeX): odpowiedzi na to pytanie prawdopodobnie również będą tam obowiązywać, ale nie na odwrót.
Odpowiedzi:
Rozważ wewnętrzne makra LaTeX zamiast tych udokumentowanych
Na przykład
\roman
jest udokumentowanym makrem LaTeX, które działa na licznikach LaTeX. Aby włączyć42
się doXLIV
ciebie, że trzeba użyć czegoś podobnegoZamiast tego, patrząc na
\roman
to, jak jest zaimplementowany (użyj go,\show\roman
aby uzyskać to interaktywnie, zamiast czytać pliki źródłowe), możesz zobaczyć, że jest on zaimplementowany pod względem użytecznego makra o nazwie\@roman
, i zamiast tego użyj go bezpośrednio:\catcode`@11
jest golfowym sposobem pisania\makeatletter
(czysty sposób w LaTeX) lub\catcode`\@=11
(czysty sposób w zwykłym TeX). Jest potrzebny tylko raz na początku, po czym możesz użyć nazw makr zawierających@
.źródło
~
może być użyty jako makro (podobnie jak inne aktywne postacie)Przykład
Przed:
Po:
Objaśnienie : Zasadniczo makra w TeX to „sekwencje kontrolne”: możesz zdefiniować
\something
lub\a
. Ale możesz iść jeszcze krócej, używając aktywnej postaci. Jedynym aktywnym znakiem, który jest domyślnie obecny (w zwykłym TeX / LaTeX) jest~
(używany do „remisów”, tj. Zdefiniowany jak\penalty \@M \
w zwykłym TeX (kara 10000, po której następuje spacja), i jak\nobreakspace {}
w LaTeX). Ale nic nie stoi na przeszkodzie, aby zdefiniować go na nowo w jakimkolwiek celu.Ponadto : możesz zrobić to samo z dowolnym innym znakiem, ustawiając jego kod kota na
\active
(13). Na przykład, coZ
aktywną postać ma „koszt” 12 bajtów:\catcode`Z13
. Następnie możesz użyć po prostuZ
wszędzie zamiast makra takiego jak\z
. W przypadku niektórych postaci, które zaczynają się od specjalnego znaczenia, bezpośrednie podejście wstecz nie działa i potrzebujesz jeszcze jednej postaci:\catcode`\Z13
lub\catcode90=13
.źródło
\def
może pasować do ustalonych wzorówPowiedzmy, że miałeś
\def\a #1 #2 {...some definition here...}
. Następnie, gdy wywołasz go na ciąg znaków, np.\a Act42, Scene26
Wewnątrz makra, argumenty mogą być przypisane jak # 1 <-Act42,
, # 2 <-Scene26
i wtedy będziesz musiał wykonać dalsze prace, aby wyodrębnić odpowiednie części. Zamiast tego można bezpośrednio pisaća następnie wywołanie go tak, jak
\a Act42, Scene26
by bezpośrednio ustawić # 1 <-42
i # 2 <-26
.(Jest to w zasadzie definicja
\def
, ale łatwo ją zapomnieć, ponieważ zwykle nie robi się tego w LaTeX, woląc przekazywać argumenty{}
tak, jakby były wywołaniami funkcji).źródło
Wybieranie między zwykłym TeX a LaTeX
Wiele można o tym powiedzieć, ale w skrócie porównaj typowy zwykły dokument TeX, który drukuje „Cześć” z typowym dokumentem LaTeX dla tego samego:
przeciw
„Koszt” LaTeX (golf wrt code) jest oczywisty; „zaletą” jest oczywiście to, że LaTeX zawiera bibliotekę wielu wstępnie napisanych makr i pakietów, z których niektóre mogą być przydatne do danego zadania.
źródło
\@Roman
(uruchomienie wielkich liter w trybie zwykłym kosztowałoby dużo bajtów) - ale zwykły TeX byłby często krótszy.\input ...
jest krótszy niż\usepackage{...}
Na przykład możesz pisać
zamiast
czyli o 6 mniej bajtów.
źródło
\usepackage
zauważyć, że staje się to bardziej wydajne, gdy liczba dołączanych pakietów rośnie. Ponieważ możesz użyć więcej niż jednego pakietu z tylko jedną\usepackage
instrukcją, ale wymagać\input
dla każdego pakietu, jeśli używasz 3 lub więcej pakietów,\usepackage
staje się lepszą opcją.Jeśli używasz LaTeX, użyj krótkiego
documentclass
(pomysł Chris H )Zamiast zaczynać od typowego
można wybrać krótsze klasy dokumentów, takie jak
book
lub nawetlub
źródło
article
domyślnie numeruje strony, można to uznać za dodatkowe wyniki. Być może meta pytanie ma na celu określenie, które klasy dokumentów powinny być dozwolone.g.cls
który jest właśniearticle.cls
z,\pagenumbering{gobble}
ale ponieważ github jest w dół, nie mogę tego teraz nałożyćg.cls
Utworzenie środowiska o nazwie
myenvironment
generuje polecenia\myenvironment
i\endmyenvironment
. Są one używane wewnętrznie do rozpoczynania i kończenia środowiska. W niektórych przypadkach mogą być używane jako skróty. Na przykład zamiastmożna zrobić
Nieobsługiwany, niewiarygodny, nie działa we wszystkich przypadkach, należy używać na własne ryzyko itp. Itp.
źródło
\itemize{...}
aby uzyskać jeszcze więcej oszczędności.\usepackage{packagea,packageb,packagec}
działa, o ile nie przekazujesz opcji do pakietów.źródło
Poprowadź linie razem. Podziały wiersza są rzadko potrzebne w LaTeX / TeX, w porównaniu do wielu długich języków.
źródło
Niektóre makra, które mogą wymagać nawiasów klamrowych wokół ich argumentów, faktycznie tego nie robią, zwłaszcza gdy są używane w innym makrze z
#1
argumentami -style.Większość makr potrzebuje tylko nawiasów, jeśli w argumencie jest więcej niż jeden token (sekwencja znaków lub kontroli).
źródło
Jeśli potrzebujesz kilka razy używać tego samego makra o długiej nazwie, możesz użyć
\let
do zdefiniowania krótszego aliasu.To oszczędza dwa bajty
\def\a{\mymacrowithalongname}
, jeśli nie potrzebujesz wielu tokenów w definicji.Zamiast nazwy makra możesz mieć aktywną postać do zapisania na odwrotnych ukośnikach.
Zauważ, że
\let
nie działa tylko z nazwami makr, ale także z wbudowanymi operacjami podstawowymi. Na przykład, jeśli używasz wielu\ifnum ... \fi
konstrukcji w swoim kodzie, zdefiniowanie\let\i\ifnum
i użycie\i ... \fi
może zaoszczędzić kilka bajtów. Działa to nawet dla\let
siebie:\let\l\let
.źródło
Mądrze używaj lokalnych
{
...}
grupJak wskazano w tej odpowiedzi , aktywne znaki, takie jak,
~
mogą być użyte jako nazwa makra. Niestety,~
jest to domyślnie jedyny aktywny znak, a zmiana kodu cat dla innego znaku jest kosztowna:\catcode`!13
zajmuje 12 bajtów. Jeśli nowa definicja makra jest potrzebna tylko w małym regionie kodu, lokalne grupy mogą być rozwiązaniem.Kiedy TeX wchodzi do nowej grupy lokalnej otwartej przez
{
, tworzy nowy poziom grupowania na wewnętrznym stosie zapisu. Oznacza to, że wszystkie bieżące makra i rejestry są zapisywane. Wszelkie ich modyfikacje (chyba że wyraźnie oznaczone jako\global
) są teraz aktywne tylko do momentu zamknięcia grupy przez}
. To znaczy że~
można go przedefiniować w grupie, użyć tam z nową definicją, a stara definicja zostanie automatycznie przywrócona po zakończeniu grupy.Oto przykład:
To wychodzi
Ciekawym efektem ubocznym tego mechanizmu grupowania jest to, że stare wartości są nadal dostępne w grupie, dopóki się tam nie zmienią. Aby to zilustrować, wyobraźmy sobie, że chcemy wydrukować pewną liczbę znaków na podstawie wartości licznika, uzupełnić je spacjami do ustalonej długości i kontynuować z oryginalną wartością licznika. Można to osiągnąć poprzez:
które wyjścia
To zachowanie grupowania jest szczególnie ważne, jeśli chcesz używać standardowych makr TeXa do
\loop ... \repeat
zagnieżdżania w pętli . Te makra definiują wewnętrzne polecenia i używają ich do określania sposobu postępowania. Zagnieżdżenie ich bez wstawiania pętli wewnętrznej w nawiasy klamrowe spowoduje zamieszanie wewnętrznych poleceń i doprowadzi do nieoczekiwanego zachowania.źródło
Postęp liczników, takich jak
działa również jako
Ta sama zasada działa również przy inicjalizacji:
ustawia licznik \ u na 1.
Zauważ, że wymagają one po nich spacji (podział wiersza lub spacja) (lub a
\relax
, ale spacja robi to samo), więc następne polecenie nie zostanie zignorowane. Na przykład,NIE drukuje \ u, ale ignoruje
\the
polecenie.źródło
\enddocument
zamiast\end{document}
zapisuje dwa znakiźródło
\begin{document}
=>\document
chociaż