Kiat untuk bermain golf di TeX / LaTeX

28

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.

ShreevatsaR
sumber
Bagaimana Anda bisa menggunakan bahasa non-pemrograman?
The Great Duck
1
@TheGreatDuck Sangat buruk :-)
ShreevatsaR
@TheGreatDuck Sebenarnya, TeX adalah bahasa pemrograman, meskipun biasanya hanya digunakan sebagai bahasa tipografi.
gvgramazio

Jawaban:

15

Pertimbangkan makro LaTeX internal daripada yang didokumentasikan

Misalnya, \romanadalah makro LaTeX yang terdokumentasi yang berfungsi pada penghitung LaTeX. Untuk berubah 42menjadi XLIVAnda harus menggunakan sesuatu seperti

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

Alih-alih, dengan melihat bagaimana \romanpenerapannya (gunakan \show\romanuntuk 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
\@roman{42}

\catcode`@11adalah 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 @.

ShreevatsaR
sumber
13

~dapat digunakan sebagai makro (seperti halnya karakter aktif lainnya)

Contoh

Sebelum:

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

Setelah:

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

Penjelasan : Umumnya makro di TeX adalah "urutan kontrol": Anda dapat mendefinisikan \somethingatau \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, membuat Zkarakter yang aktif memiliki "biaya" dari 12 byte: \catcode`Z13. Kemudian Anda bisa menggunakan di Zmana 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`\Z13atau \catcode90=13.

ShreevatsaR
sumber
9

\def dapat mencocokkan pola yang diperbaiki

Katakanlah 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 <- Scene26dan kemudian Anda harus melakukan beberapa pekerjaan lebih lanjut untuk mengekstrak bagian yang relevan. Sebaliknya, orang bisa langsung menulis

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

dan kemudian memanggilnya seperti yang \a Act42, Scene26akan langsung mengatur # 1 <- 42dan # 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.)

ShreevatsaR
sumber
8

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:

Hello
\bye

melawan

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

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

ShreevatsaR
sumber
Saya terjebak dalam menggunakan LaTeX karena \@Roman(mendapatkan huruf besar untuk bekerja di dataran akan membutuhkan banyak byte) - tetapi TeX biasa sering lebih pendek.
Chris H
8

\input ... lebih pendek dari \usepackage{...}

Misalnya, Anda bisa menulis

\input color

dari pada

\usepackage{color}

yang 6 byte lebih sedikit.

Fatalisasi
sumber
8
Akan bermanfaat untuk menunjukkan bahwa hal itu \usepackagemenjadi lebih efisien karena jumlah paket yang Anda masukkan naik. Karena Anda dapat menggunakan lebih dari satu paket dengan hanya satu \usepackagepernyataan, tetapi mengharuskan \inputuntuk setiap paket, Jika Anda menggunakan 3 paket atau lebih, \usepackagemenjadi opsi yang lebih baik.
Wheat Wizard
7

Jika menggunakan LaTeX, gunakan shortdocumentclass (ide oleh Chris H )

Alih-alih memulai dengan tipikal

\documentclass{article}

seseorang dapat memilih kelas dokumen yang lebih pendek seperti bookatau bahkan

\documentclass{ecv}

atau

\documentclass{tui}
ShreevatsaR
sumber
Anda harus ingat untuk tetap berada dalam spesifikasi pertanyaan, articledengan nomor default halamannya, ini dapat dianggap sebagai output tambahan. Mungkin sebuah pertanyaan meta untuk menentukan kelas dokumen apa yang harus diizinkan.
Wheat Wizard
@WheatWizard Poin bagus. Saya pikir mungkin tergantung pada pertanyaan individu apakah nomor halaman dianggap sebagai output ekstra.
ShreevatsaR
Saya rasa kelas minimal adalah ide yang bagus - nama huruf tunggal dan tidak ada penomoran halaman
Chris H
Saya telah mengumpulkan g.clsyang hanya article.clsdengan \pagenumbering{gobble}tetapi karena github turun saya tidak bisa memasangnya untuk saat ini
Chris H
g.cls
Chris H
7

Menciptakan lingkungan yang disebut myenvironmentmenghasilkan perintah \myenvironmentdan \endmyenvironment. Ini digunakan secara internal untuk memulai dan mengakhiri lingkungan. Dalam beberapa kasus mereka dapat digunakan sebagai jalan pintas. Misalnya, bukannya

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

seseorang bisa melakukannya

\itemize
\item abc
\enditemize

Tidak didukung, tidak dapat diandalkan, tidak berfungsi dalam semua kasus, digunakan dengan risiko Anda sendiri, dll.

Ian Thompson
sumber
Selamat datang di situs ini!
DJMcMayhem
3
Anda sering dapat melakukan \itemize{...}penghematan lebih banyak lagi.
Wheat Wizard
4

\usepackage{packagea,packageb,packagec} berfungsi, selama Anda tidak meneruskan opsi ke paket.

Chris H.
sumber
4

Jalankan garis bersama. Jeda baris jarang diperlukan di LaTeX / TeX, dibandingkan dengan banyak bahasa bentuk panjang.

Chris H.
sumber
3

Beberapa makro yang mungkin Anda harapkan perlu menguatkan argumen mereka sebenarnya tidak, terutama ketika digunakan di dalam makro lain dengan #1argumen-gaya.

Sebagian besar makro hanya membutuhkan kawat gigi jika ada lebih dari satu token (karakter atau urutan kontrol) dalam argumen.

\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}
Chris H.
sumber
3

Jika Anda perlu menggunakan makro yang sama dengan nama panjang beberapa kali, Anda dapat menggunakan \letuntuk mendefinisikan alias lebih pendek.

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

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 \lettidak hanya berfungsi dengan nama makro tetapi juga dengan primitif bawaan. Misalnya, jika Anda menggunakan banyak \ifnum ... \fikonstruksi dalam kode Anda, mendefinisikan \let\i\ifnumdan menggunakan bukan \i ... \fidapat menghemat beberapa byte. Bahkan ini bekerja untuk \letdirinya sendiri: \let\l\let.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Gunakan lokal {... }grup dengan bijak

Seperti 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`!13membutuhkan 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:

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

Ini output

abc - 123 - abc

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:

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

output yang mana

Cetak char 3 kali, pad dengan 7 spasi, dan lanjutkan dengan x = 3.

Perilaku pengelompokan ini sangat penting jika Anda ingin menggunakan makro standar TeX untuk looping \loop ... \repeatbersarang. 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.

siracusa
sumber
1

Kemajuan counter, seperti

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

juga bekerja sebagai

\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

Prinsip yang sama juga berfungsi untuk inisialisasi:

\newcount\u\u1

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,

\u1\the\u

TIDAK mencetak \ u, tetapi mengabaikan \theperintah.

Simon Klaver
sumber
1

\enddocumentalih-alih \end{document}menyimpan dua karakter

sheß
sumber
Tampaknya tidak bekerja untuk \begin{document}=> \documentmeskipun
sheß