Kiat apa yang dimiliki orang untuk bermain golf di TeX / LaTeX? Silakan kirim satu tip per jawaban, masing-masing setidaknya agak khusus untuk TeX / LaTeX.
Konteks: Saya perhatikan jawaban ini dan tidak ada pertanyaan kiat untuk TeX / LaTeX, jadi saya membuat yang ini. Ada beberapa tumpang tindih dengan tips pertanyaan yang lebih sempit untuk bermain golf di TikZ (karena TikZ adalah paket makro khusus di atas TeX / LaTeX): jawaban untuk pertanyaan ini mungkin juga berlaku di sana, tetapi tidak sebaliknya.
Jawaban:
Pertimbangkan makro LaTeX internal daripada yang didokumentasikan
Misalnya,
\roman
adalah makro LaTeX yang terdokumentasi yang berfungsi pada penghitung LaTeX. Untuk berubah42
menjadiXLIV
Anda harus menggunakan sesuatu sepertiAlih-alih, dengan melihat bagaimana
\roman
penerapannya (gunakan\show\roman
untuk mendapatkan ini secara interaktif, alih-alih membaca file sumber), orang dapat melihat bahwa itu diimplementasikan dalam hal makro yang disebut bermanfaat\@roman
, dan alih-alih menggunakannya secara langsung:\catcode`@11
adalah cara penulisan golf\makeatletter
(cara bersih di LaTeX) atau\catcode`\@=11
(cara bersih di TeX polos). Ini hanya diperlukan sekali di awal, setelah ini Anda dapat menggunakan nama makro yang mengandung@
.sumber
~
dapat digunakan sebagai makro (seperti halnya karakter aktif lainnya)Contoh
Sebelum:
Setelah:
Penjelasan : Umumnya makro di TeX adalah "urutan kontrol": Anda dapat mendefinisikan
\something
atau\a
. Tapi Anda bisa lebih pendek, dengan menggunakan karakter aktif. Satu-satunya karakter aktif yang hadir secara default (dalam TeX polos / LaTeX) adalah~
(digunakan untuk "ikatan", yaitu didefinisikan\penalty \@M \
dalam TeX polos (penalti 10.000 diikuti oleh spasi), dan seperti\nobreakspace {}
pada LaTeX). Tetapi tidak ada yang menghentikan Anda untuk mendefinisikannya kembali untuk tujuan apa pun yang Anda butuhkan.Selanjutnya : Anda dapat melakukan hal yang sama dengan karakter lain dengan mengatur katcode-nya ke
\active
(13). Misalnya, membuatZ
karakter yang aktif memiliki "biaya" dari 12 byte:\catcode`Z13
. Kemudian Anda bisa menggunakan diZ
mana saja dan bukan seperti makro\z
. Untuk beberapa karakter yang dimulai dengan makna khusus, pendekatan backtick langsung tidak berfungsi dan Anda memerlukan satu karakter lagi:\catcode`\Z13
atau\catcode90=13
.sumber
\def
dapat mencocokkan pola yang diperbaikiKatakanlah Anda punya
\def\a #1 #2 {...some definition here...}
. Kemudian ketika Anda menyebutnya pada string seperti\a Act42, Scene26
, di dalam makro argumen dapat ditetapkan seperti # 1 <-Act42,
, # 2 <-Scene26
dan kemudian Anda harus melakukan beberapa pekerjaan lebih lanjut untuk mengekstrak bagian yang relevan. Sebaliknya, orang bisa langsung menulisdan kemudian memanggilnya seperti yang
\a Act42, Scene26
akan langsung mengatur # 1 <-42
dan # 2 <-26
.(Ini pada dasarnya adalah definisi
\def
, tetapi mudah untuk dilupakan karena seseorang biasanya tidak melakukan ini di LaTeX, lebih suka meneruskan argumen{}
seolah-olah itu adalah panggilan fungsi.)sumber
Memilih antara TeX biasa dan LaTeX
Banyak yang bisa dikatakan tentang ini, tetapi singkatnya, bandingkan dokumen TeX biasa yang mencetak "Halo" dengan dokumen LaTeX yang khas untuk hal yang sama:
melawan
"Biaya" LaTeX (golf kode wrt) jelas; "manfaat" tentu saja adalah bahwa LaTeX dilengkapi dengan perpustakaan banyak makro dan paket pra-tertulis, beberapa di antaranya mungkin berguna untuk tugas yang sedang dihadapi.
sumber
\@Roman
(mendapatkan huruf besar untuk bekerja di dataran akan membutuhkan banyak byte) - tetapi TeX biasa sering lebih pendek.\input ...
lebih pendek dari\usepackage{...}
Misalnya, Anda bisa menulis
dari pada
yang 6 byte lebih sedikit.
sumber
\usepackage
menjadi lebih efisien karena jumlah paket yang Anda masukkan naik. Karena Anda dapat menggunakan lebih dari satu paket dengan hanya satu\usepackage
pernyataan, tetapi mengharuskan\input
untuk setiap paket, Jika Anda menggunakan 3 paket atau lebih,\usepackage
menjadi opsi yang lebih baik.Jika menggunakan LaTeX, gunakan short
documentclass
(ide oleh Chris H )Alih-alih memulai dengan tipikal
seseorang dapat memilih kelas dokumen yang lebih pendek seperti
book
atau bahkanatau
sumber
article
dengan nomor default halamannya, ini dapat dianggap sebagai output tambahan. Mungkin sebuah pertanyaan meta untuk menentukan kelas dokumen apa yang harus diizinkan.g.cls
yang hanyaarticle.cls
dengan\pagenumbering{gobble}
tetapi karena github turun saya tidak bisa memasangnya untuk saat inig.cls
Menciptakan lingkungan yang disebut
myenvironment
menghasilkan perintah\myenvironment
dan\endmyenvironment
. Ini digunakan secara internal untuk memulai dan mengakhiri lingkungan. Dalam beberapa kasus mereka dapat digunakan sebagai jalan pintas. Misalnya, bukannyaseseorang bisa melakukannya
Tidak didukung, tidak dapat diandalkan, tidak berfungsi dalam semua kasus, digunakan dengan risiko Anda sendiri, dll.
sumber
\itemize{...}
penghematan lebih banyak lagi.\usepackage{packagea,packageb,packagec}
berfungsi, selama Anda tidak meneruskan opsi ke paket.sumber
Jalankan garis bersama. Jeda baris jarang diperlukan di LaTeX / TeX, dibandingkan dengan banyak bahasa bentuk panjang.
sumber
Beberapa makro yang mungkin Anda harapkan perlu menguatkan argumen mereka sebenarnya tidak, terutama ketika digunakan di dalam makro lain dengan
#1
argumen-gaya.Sebagian besar makro hanya membutuhkan kawat gigi jika ada lebih dari satu token (karakter atau urutan kontrol) dalam argumen.
sumber
Jika Anda perlu menggunakan makro yang sama dengan nama panjang beberapa kali, Anda dapat menggunakan
\let
untuk mendefinisikan alias lebih pendek.Ini menyimpan dua byte pada
\def\a{\mymacrowithalongname}
, jika Anda tidak perlu beberapa token dalam definisi.Alih-alih nama makro, Anda dapat memiliki karakter aktif untuk menghemat backslash.
Perhatikan bahwa
\let
tidak hanya berfungsi dengan nama makro tetapi juga dengan primitif bawaan. Misalnya, jika Anda menggunakan banyak\ifnum ... \fi
konstruksi dalam kode Anda, mendefinisikan\let\i\ifnum
dan menggunakan bukan\i ... \fi
dapat menghemat beberapa byte. Bahkan ini bekerja untuk\let
dirinya sendiri:\let\l\let
.sumber
Gunakan lokal
{
...}
grup dengan bijakSeperti yang ditunjukkan dalam jawaban ini , karakter aktif seperti
~
dapat digunakan sebagai nama makro. Sayangnya,~
ini adalah satu-satunya karakter aktif secara default, dan mengubah katcode untuk karakter lain itu mahal:\catcode`!13
membutuhkan 12 byte. Jika definisi makro baru hanya diperlukan di wilayah kecil kode Anda, grup lokal dapat menjadi solusi.Ketika TeX memasuki grup lokal baru yang dibuka oleh
{
, TeX menciptakan tingkat pengelompokan baru pada tumpukan penyimpanan internal. Ini berarti bahwa semua makro dan register saat ini disimpan. Setiap modifikasi terhadap mereka (kecuali ditandai secara eksplisit\global
) sekarang hanya aktif sampai grup ditutup oleh}
. Ini berarti bahwa~
dapat didefinisikan ulang dalam suatu grup, digunakan di sana dengan definisi baru, dan definisi lama akan secara otomatis dikembalikan setelah grup selesai.Ini sebuah contoh:
Ini output
Efek samping yang menarik dari mekanisme pengelompokan ini adalah bahwa nilai-nilai lama masih tersedia di dalam kelompok sampai mereka diubah di sana. Untuk mengilustrasikannya, bayangkan kita ingin mencetak sejumlah karakter berdasarkan nilai penghitung, padinya dengan spasi hingga panjang tetap, dan lanjutkan dengan nilai penghitung asli. Ini bisa dicapai dengan yang berikut:
output yang mana
Perilaku pengelompokan ini sangat penting jika Anda ingin menggunakan makro standar TeX untuk looping
\loop ... \repeat
bersarang. Makro ini menetapkan perintah internal dan menggunakannya untuk menentukan cara melanjutkan. Menempatkan mereka tanpa menempatkan loop internal ke dalam kawat gigi akan membingungkan perintah internal dan menyebabkan perilaku yang tidak terduga.sumber
Kemajuan counter, seperti
juga bekerja sebagai
Prinsip yang sama juga berfungsi untuk inisialisasi:
atur penghitung \ u ke 1.
Perhatikan bahwa ini membutuhkan karakter spasi putih (linebreak atau spasi) setelahnya (atau a
\relax
, tetapi spasi putih melakukan hal yang sama) sehingga perintah berikutnya tidak akan diabaikan. Sebagai contoh,TIDAK mencetak \ u, tetapi mengabaikan
\the
perintah.sumber
\enddocument
alih-alih\end{document}
menyimpan dua karaktersumber
\begin{document}
=>\document
meskipun