TeX / LaTeX'te golf oynamak için ipuçları


28

İnsanların TeX / LaTeX'te golf oynamak için hangi önerileri var? Lütfen her biri en azından biraz TeX / LaTeX'e özgü olan her cevap için bir ipucu gönderin.


Bağlam: Bu cevabı farkettim ve TeX / LaTeX için ipucu sorusu olmadığını, bu yüzden bunu yaratıyorum. TikZ'de golf oynamak için daha dar soru ipuçlarıyla örtüşen bazı şeyler var (TikZ, TeX / LaTeX'in üzerinde özel bir makro paketi olduğu için): Bu sorunun yanıtları muhtemelen orada da geçerli olacak, ancak bunun tersi geçerli olmayacak.


Programlamayan bir dili nasıl golf yapabilirsiniz?
Büyük Ördek

1
@TheGreatDuck Çok kötü :-)
ShreevatsaR

@GreatDuck Aslında, TeX , genellikle sadece tipografik olarak kullanılsa bile , bir programlama dilidir.
gvgramazio

Yanıtlar:


15

Belgelenmiş olanlar yerine dahili LaTeX makrolarını göz önünde bulundurun

Örneğin, \romanLaTeX sayaçlarında çalışan belgelenmiş bir LaTeX makrosu. Açmak için 42içine XLIVsizin gibi bir şey kullanmak zorunda

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

Bunun yerine, nasıl \romanuygulandığına bakılarak ( \show\romankaynak dosyaları okumak yerine, etkileşimli olarak bunu kullanmak için kullanın ), denilen yararlı bir makro açısından uygulandığını görebilir \@romanve bunun yerine doğrudan kullanabilirsiniz:

\catcode`@11
\@roman{42}

\catcode`@11Golfy Yazma şekli \makeatletter( LaTeX'te temiz) veya \catcode`\@=11(düz TeX'te temiz). Sadece başında bir kez ihtiyaç vardır, bundan sonra içeren makro adlarını kullanabilirsiniz @.


13

~Makro olarak kullanılabilir (diğer aktif karakterler gibi)

Örnek

Önce:

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

Sonra:

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

Açıklama : Genellikle TeX'teki makrolar “kontrol dizileridir”: \somethingveya tanımlayabilirsiniz \a. Ancak aktif bir karakter kullanarak daha da kısaltabilirsiniz. Varsayılan olarak mevcut olan tek aktif karakter (düz TeX / LaTeX'te) (düz ~bağlar için kullanılır, yani \penalty \@M \düz TeX'te (10000'lük bir boşluk ve ardından boşluk) ve \nobreakspace {}LaTeX'te olduğu gibi ) tanımlanır. Ancak hiçbir şey, ihtiyaç duyduğunuz amaç için yeniden tanımlamanızı engelleyemez.

Ayrıca : Cat kodunu \active(13) ayarlayarak aynı karakteri başka bir karakterle yapabilirsiniz . Örneğin, yapım Zaktif karakterini 12 bayt "maliyeti" vardır: \catcode`Z13. Sonra Zbir makro yerine her yeri kullanabilirsiniz \z. Özel bir anlamla başlayan bazı karakterler için, doğrudan geri tepme yaklaşımı çalışmaz ve bir karakter daha gerekir: \catcode`\Z13veya \catcode90=13.


9

\def sabit kalıplarla eşleşebilir

Diyelim ki vardı \def\a #1 #2 {...some definition here...}. Sonra onu gibi bir dizgide aradığınızda \a Act42, Scene26, makro içinde argümanlar # 1 <- Act42,, # 2 <- gibi atanabilir Scene26ve ardından ilgili parçaları çıkarmak için biraz daha çalışmanız gerekir. Bunun yerine, biri doğrudan yazabilir

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

ve sonra o kadar çağırarak \a Act42, Scene26doğrudan 1. <kuracak - 42ve 2. <- 26.

(Temel olarak bu tanımdır \def, ancak LaTeX'te genellikle bunu yapmadığından, argümanları {}işlev çağrılarıymış gibi argümanlara aktarmayı tercih etmeyi unutmak kolaydır .)


8

Düz TeX ve LaTeX arasında seçim yapma

Bununla ilgili çok fazla şey söylenebilir, ancak kısaca, "Merhaba" yazan normal bir düz TeX belgesini, bunun için tipik bir LaTeX belgesiyle karşılaştırın:

Hello
\bye

e karşı

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

LaTeX'in "maliyeti" (wrt code golf) açıktır; Elbette "yararı", LaTeX'in, bazıları eldeki görev için yararlı olabilecek önceden yazılmış birçok makro ve paketlerden oluşan bir kütüphane ile birlikte gelmesidir.


LaTeX'i kullanmaya zorlandım \@Roman(büyük harflerin düz olarak çalışması büyük bir byte'a mal olur) - ancak düz TeX genellikle daha kısa olurdu.
Chris H,

8

\input ... daha kısa \usepackage{...}

Mesela yazabilirsiniz

\input color

yerine

\usepackage{color}

6 az bayt olan.


8
Ancak, \usepackagedahil ettiğiniz paket sayısı arttıkça daha verimli hale geldiğine dikkat çekmek faydalı olacaktır . Birden fazla paketi yalnızca bir \usepackageifadeyle kullanabildiğinizden ancak \inputher paket için bir gereksinim duyduğunuzdan , 3 veya daha fazla paket kullanıyorsanız \usepackage, daha iyi bir seçenek haline gelir.
Buğday Sihirbazı

7

LaTeX kullanıyorsanız, kısa bir kullanındocumentclass ( Chris H tarafından fikir )

Tipik olarak başlamak yerine

\documentclass{article}

biri gibi kısa belge sınıfları seçebilir bookve hatta

\documentclass{ecv}

veya

\documentclass{tui}

Sorunun özellikleri dahilinde kalmayı hatırlamalısınız, articlevarsayılan olarak sayfalarına göre, bu fazladan çıktı olarak kabul edilebilir. Belki de hangi belge sınıflarına izin verilmesi gerektiğini belirlemek için bir meta soru olabilir.
Buğday Sihirbazı

@WheatWizard İyi nokta. Sayfa numaralarının ekstra çıktı olarak kabul edilip edilmeyeceği kişisel soruya bağlı olabilir.
ShreevatsaR

Minimal bir sınıfın iyi bir fikir olacağını düşünüyorum - tek bir harf adı ve sayfa numaralandırması yok
Chris H

Bir araya getirdik g.clssadece hangi article.clsile \pagenumbering{gobble}github aşağı olduğu gibi ama şimdi için o kadar koyamazsınız
Chris H


7

Denilen bir ortam myenvironmentyaratmak, komutları \myenvironmentve üretir \endmyenvironment. Bunlar çevreyi başlatmak ve bitirmek için dahili olarak kullanılır. Bazı durumlarda kısayol olarak kullanılabilirler. Örneğin, yerine

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

biri yapabilir

\itemize
\item abc
\enditemize

Desteklenmiyor, güvenilir değil, her durumda işe yaramaz, kendi tehlikenizde kullanın vb.


Siteye Hoşgeldiniz!
DJMcMayhem

3
Daha \itemize{...}fazla tasarruf için sık sık yapabilirsiniz .
Buğday Sihirbazı 19

4

\usepackage{packagea,packageb,packagec} seçenekleri paketlere geçmediğiniz sürece çalışır.


4

Çizgileri birlikte çalıştırın. Uzun süreli dillerle karşılaştırıldığında, LaTeX / TeX'te satır sonlarına nadiren ihtiyaç duyulur.


3

Argümanlarına yaklaşmak için bekleyebileceğiniz bazı makrolar aslında, özellikle de #1stil argümanlarına sahip başka bir makroda kullanıldığında, aslında kullanılmaz .

Çoğu makro yalnızca, bağımsız değişkende birden fazla simge (karakter veya kontrol sırası) varsa desteklere ihtiyaç duyar.

\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

Aynı makroyu uzun bir adla birkaç kez kullanmanız gerekirse, \letdaha kısa bir diğer ad tanımlamak için kullanabilirsiniz .

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

\def\a{\mymacrowithalongname}Tanımda birden fazla belirteç gerekmiyorsa, bu işlem iki bayttan tasarruf sağlar .

Bir makro adı yerine , ters eğik çizgilere kaydetmek için etkin bir karaktere sahip olabilirsiniz .

Bunun \letyalnızca makro adlarıyla değil aynı zamanda yerleşik ilkellerle de işe yaradığını unutmayın . Örneğin, \ifnum ... \fikodunuzda çok sayıda yapı \let\i\ifnumkullanıyorsanız , tanımlamak ve bunun yerine kullanmak \i ... \fibirkaç bayttan tasarruf sağlayabilir. Bu bile için çalışır \letkendisi: \let\l\let.


3

Akıllıca yerel {... }grupları kullanın

Bu cevapta belirtildiği gibi ~, gibi aktif karakterler bir makro adı olarak kullanılabilir. Ne yazık ki, ~varsayılan olarak tek aktif karakterdir ve başka bir karakter için kod kodunu değiştirmek pahalıdır: \catcode`!1312 bayt sürer. Yeni makro tanımına yalnızca kodunuzun küçük bir bölgesinde ihtiyaç duyulursa, yerel gruplar bir çözüm olabilir.

TeX açılan yeni bir yerel gruba girdiğinde {, iç tasarruf yığında yeni bir gruplama düzeyi oluşturur. Bu, mevcut tüm makro ve kayıtların kaydedildiği anlamına gelir. Bunlarda yapılacak herhangi bir değişiklik (açıkça işaretlenmediği sürece \global) şu anda sadece grup tarafından kapatılana kadar aktif durumdadır }. Bu, ~bir grup içinde yeniden tanımlanabilecek, orada yeni tanımla kullanılan ve eski tanım, grup bittikten sonra otomatik olarak geri yükleneceği anlamına gelir.

İşte bir örnek:

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

Bu çıkışlar

abc - 123 - abc

Bu gruplandırma mekanizmasının ilginç bir yan etkisi, eski değerlerin orada değişinceye kadar grup içinde hala mevcut olmasıdır. Bunu göstermek için, bir sayacın değerini temel alan bir dizi karakter yazdırmak istediğimizi, bunları sabit bir uzunluğa kadar boşluklarla doldurup orijinal sayaç değeriyle devam etmek istediğimizi hayal edin. Bu, aşağıdakilerle başarılabilir:

\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.

hangi çıktılar

3 kez bir char yazdırın, 7 boşluk ile doldurun ve x = 3 ile devam edin.

Bu gruplama davranışı, TeX'in \loop ... \repeatiç içe döngü için standart makrolarını kullanmak istiyorsanız özellikle önemlidir . Bu makrolar dahili komutları tanımlar ve nasıl ilerleyeceğinizi belirlemek için bunları kullanır. Onları iç halkayı diş tellerine sokmadan yerleştirmek, iç komutları şaşırtacak ve beklenmeyen davranışlara yol açacaktır.


1

Sayaçların ilerlemesi, örneğin

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

ayrıca

\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

Aynı ilke, başlangıç ​​için de geçerlidir:

\newcount\u\u1

sayacı \ u 1 olarak ayarlar.

Bunların, onlardan sonra (veya a \relax, ancak boşluklar aynı yapar ) bir boşluk karakterine (satır sonu veya boşluk) ihtiyaç duyduğunu unutmayın; böylece bir sonraki komut göz ardı edilmez. Örneğin,

\u1\the\u

\ u yazdırmaz, ancak \thekomutu yok sayar .


1

\enddocumentyerine \end{document}iki karakter kaydeder


\begin{document}=> \documentOlsa işe
yaramış
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.