เคล็ดลับสำหรับการเล่นกอล์ฟใน TeX / LaTeX


28

ผู้คนมีเคล็ดลับอะไรบ้างในการเล่นกอล์ฟใน TeX / LaTeX โปรดโพสต์หนึ่งเคล็ดลับต่อคำตอบอย่างน้อยก็ค่อนข้างเฉพาะเจาะจงกับ TeX / LaTeX


บริบท: ฉันสังเกตเห็นคำตอบนี้และไม่มีคำถามเคล็ดลับสำหรับ TeX / LaTeX ดังนั้นฉันจึงสร้างมันขึ้นมา มีการทับซ้อนกับเคล็ดลับคำถามที่แคบกว่าสำหรับการเล่นกอล์ฟใน TikZ (เนื่องจาก TikZ เป็นแพคเกจแมโครเฉพาะด้านบนของ TeX / LaTeX): คำตอบสำหรับคำถามนี้อาจจะนำไปใช้ที่นั่น แต่ไม่ใช่วิธีอื่น ๆ


คุณจะเล่นกอล์ฟแบบไม่ใช้ภาษาได้อย่างไร?
The Great Duck

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

คำอธิบาย : โดยทั่วไปแมโครในเท็กซ์คือ“ลำดับการควบคุม”: คุณสามารถกำหนดหรือ\something \aแต่คุณสามารถสั้นกว่านี้ได้โดยใช้อักขระที่ใช้งานอยู่ อักขระที่แอ็คทีฟเพียงตัวเดียวที่มีอยู่ตามค่าเริ่มต้น (ในแบบธรรมดา TeX / LaTeX) คือ~(ใช้สำหรับ "ความสัมพันธ์" เช่นถูกกำหนดไว้\penalty \@M \ในแบบธรรมดา TeX (การลงโทษ 10,000 ตามด้วยช่องว่าง) และ\nobreakspace {}ใน LaTeX) แต่ไม่มีอะไรจะหยุดคุณไม่ให้นิยามใหม่สำหรับสิ่งที่คุณต้องการ

เพิ่มเติม : คุณสามารถทำเช่นเดียวกันกับตัวละครอื่น ๆ โดยการตั้งค่า catcode เป็น\active(13) ยกตัวอย่างเช่นการทำให้Zตัวละครที่ใช้งานมี "ต้นทุน" ของ 12 \catcode`Z13ไบต์: แล้วคุณสามารถใช้เพียงแค่ทุกแทนแมโครเหมือนZ \zสำหรับตัวละครบางตัวที่เริ่มต้นด้วยความหมายพิเศษที่วิธีการ backtick โดยตรงไม่ทำงานและคุณจำเป็นต้องตัวละครตัวหนึ่งเพิ่มเติมได้ที่: หรือ\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 ธรรมดาทั่วไปที่พิมพ์ "Hello" ด้วยเอกสาร LaTeX โดยทั่วไปสำหรับสิ่งเดียวกัน:

Hello
\bye

กับ

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

"ต้นทุน" ของ LaTeX (wrt code golf) นั้นชัดเจน "ประโยชน์" แน่นอนว่า LaTeX มาพร้อมกับห้องสมุดของมาโครและแพ็คเกจที่เขียนไว้ล่วงหน้าซึ่งบางอันอาจมีประโยชน์สำหรับงานที่ทำอยู่


ฉันติดอยู่กับการใช้ LaTeX เพราะ \@Roman(การใช้ตัวพิมพ์ใหญ่ในการทำงานแบบธรรมดาจะเสียค่าใช้จ่ายจำนวนมากไบต์) - แต่ธรรมดา TeX จะสั้นกว่า
Chris H

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

ฉันคิดว่าชั้นเรียนที่น้อยที่สุดจะเป็นความคิดที่ดี - ชื่อตัวอักษรเดียวและไม่มีเลขหน้า
Chris H

ฉันได้ใส่กันg.clsซึ่งเป็นเพียงarticle.clsมี\pagenumbering{gobble}แต่เป็น GitHub ลงฉันไม่สามารถใส่มันขึ้นสำหรับในตอนนี้
คริสเอช


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อาร์กิวเมนต์สไตล์

มาโครส่วนใหญ่ต้องการวงเล็บปีกกาหากมีโทเค็นมากกว่าหนึ่งตัว (ลำดับอักขระหรือตัวควบคุม) ในการโต้แย้ง

\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 สำหรับตัวละครอื่นนั้นมีราคาแพง: \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 ครั้ง, pad พร้อม 7 ช่องว่างและดำเนินการต่อด้วย x = 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

โปรดทราบว่าสิ่งเหล่านี้ต้องใช้อักขระช่องว่าง (linebreak หรือช่องว่าง) หลังจากพวกเขา (หรือ a \relaxแต่ช่องว่างทำแบบเดียวกัน) ดังนั้นคำสั่งถัดไปจะไม่ถูกละเว้น ตัวอย่างเช่น,

\u1\the\u

ไม่พิมพ์ \ u แต่ไม่สนใจ\theคำสั่ง


1

\enddocumentแทนที่จะ\end{document}บันทึกอักขระสองตัว


ดูเหมือนจะไม่ทำงาน\begin{document}=> \documentแม้ว่า
sheß
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.