(La) TeX - อักขระ '%' ทำอะไร?
%ตัวละครที่ดูเหมือนว่าจะมีจำนวนมากของใช้ จนถึงตอนนี้ฉันพบมันในสถานที่ต่อไปนี้:
- สำหรับการเขียนความคิดเห็น
% Schrodinger wave equation
$$\nabla^2\psi + \frac{8\pi^2m}{h^2}(E-V) = 0$$
- (ตรงนี้อาจจะผิด) สำหรับการแยกคำสั่งหลายบรรทัด (อ้างอิงที่นี่ )
\newcounter{bull}
\newcommand{\showbullcntr}[1]{%
\setcounter{bull}{#1}%
\bullcntr{bull}%
}
- ร่วมกับ
minipageเพื่อลบช่องว่างชั้นนำที่แทรก (ดัดแปลงจากคำถามนี้ )
\noindent
\begin{minipage}{0.5\linewidth}
...
\end{minipage}%
\begin{minipage}{0.5\linewidth}
...
\end{minipage}
ใครช่วยอธิบายโดยละเอียดเกี่ยวกับการใช้งานต่างๆของ%ตัวละครใน LaTeX ได้ไหม โดยเฉพาะอย่างยิ่งทำไมจึงใช้หลังจากอินสแตนซ์แรกของ\end{minipage}?
คำตอบ
ทั้งสามกรณีการใช้งานสำหรับ%ตัวอักษรที่คุณได้ระบุสามารถแบบครบวงจรในหนึ่งเดียวกรณีการใช้งานในช่วงโค้ง: หากต้องการยกเว้นทุกอย่างที่อยู่ในส่วนที่เหลือของสายการป้อนข้อมูลปัจจุบันจากการประมวลผลต่อไป
นี้ทุกอย่างประกอบด้วยความเห็นไม่เพียง แต่ (กรณีใช้งานครั้งแรกที่คุณกล่าวถึง) แต่ยังเป็นตัวละครที่สิ้นสุดของเส้นที่มองไม่เห็นที่ท้ายบรรทัดการป้อนข้อมูล ในความเป็นจริงหลังจากพบ%ตัวละครแล้ว TeX จะไม่สนใจช่องว่างใด ๆ ที่อาจปรากฏในตอนต้นของบรรทัดถัดไป จริงๆแล้วช่องว่างที่จุดเริ่มต้นของบรรทัดอินพุตจะถูกละเว้นเสมอไม่ว่าบรรทัดก่อนหน้าจะถูกยกเลิกด้วยหรือไม่%ก็ตาม โหมดคำต่อคำเป็นข้อยกเว้น แต่เป็นหัวข้อสำหรับการสนทนาที่แตกต่างกัน
ด้วยประการฉะนี้
Hello %
World
และ
Hello %
World
จบลงด้วยการประมวลผลในลักษณะเดียวกัน: TeX อ่านHello จากบรรทัดแรก (มีช่องว่างหลัง "Hello" รวมอยู่ด้วย) และWorldจากบรรทัดที่สองและจะแสดงผล "Hello World" สังเกตว่าอักขระท้ายบรรทัดที่ท้ายบรรทัดแรกและอักขระเว้นวรรคสี่ตัวที่จุดเริ่มต้นของบรรทัดที่สองถูกละทิ้ง
จะเกิดอะไรขึ้นถ้าอินพุตเป็น
Hello%
World
ผลลัพธ์จะเป็น "HelloWorld" ทำไม? เช่นเดิมอักขระท้ายบรรทัดที่ท้ายบรรทัดแรกและอักขระเว้นวรรคสี่ตัวที่จุดเริ่มต้นของบรรทัดที่สองจะถูกทิ้งไปและสิ่งที่เหลืออยู่คือ "สวัสดี" จากบรรทัดแรกและ "โลก" จากวินาที
ชิ้นหนึ่งที่มากขึ้นของข้อมูล: การเดียวปลายของเส้นตัวละครได้รับการแปลงระหว่างขั้นตอนการประมวลผลครั้งแรกเท็กซ์เพื่อช่องว่าง (ในทางตรงกันข้ามอักขระท้ายบรรทัดสองตัวขึ้นไปจะถูกแปลงเป็น\parโทเค็น) ดังนั้น
Hello
World
และ
Hello World
สร้างผลลัพธ์เดียวกัน
ด้วยข้อมูลเหล่านี้เราจึงสามารถทราบได้ว่าจุดประสงค์ของ%ตัวละครในโค้ดต่อไปนี้คืออะไร:
\noindent
\begin{minipage}{0.5\textwidth}
...
\end{minipage}%
\begin{minipage}{0.5\textwidth}
...
\end{minipage}
0.5\textwidth+0.5\textwidth=1\textwidthความกว้างรวมของโครงสร้างนี้คือ มี%ตัวละครรับการละเว้น, อักขระสิ้นสุดของเส้นหลังตัวอย่างแรกของ\end{minipage}จะได้รับการแปลงเป็นช่องว่างและความกว้างทั้งหมดจะได้รับบวกความกว้างของตัวละครของพื้นที่1\textwidth นั่นแทบจะไม่ใช่สิ่งที่ต้องการอย่างแน่นอน สังเกตว่ามันเป็นสิ่งสำคัญที่จะวาง%ตัวละครทันทีหลังจาก\end{minipage}; การเขียน\end{minipage} %จะไม่ตอบสนองวัตถุประสงค์ที่ตั้งใจไว้
จากนั้นพิจารณาคำจำกัดความของมาโครสองคำต่อไปนี้:
\newcommand\cmdA[1]{
#1}
\newcommand\cmdB[1]{%
#1}
คำจำกัดความทั้งสองเป็นกฎหมาย โดยเฉพาะอย่างยิ่งไม่จำเป็นอย่างยิ่งโดยเฉพาะจากมุมมองที่เป็นรูปแบบเชิงวากยสัมพันธ์เพียงอย่างเดียวในการระบุ%อักขระหลังจากนั้น\newcommand\cmdA[1]{เพื่อให้มาโครรวบรวมได้ แต่นี่ไม่ได้หมายความว่ามาโครทั้งสองให้ผลลัพธ์เดียวกัน คุณสามารถคาดเดาสิ่งที่\cmdA{abc}\cmdA{abc}และ\cmdB{abc}\cmdB{abc}ออกจะ? เพื่อความง่ายโปรดสมมติว่าลำดับคำสั่งทั้งสองเกิดขึ้นที่จุดเริ่มต้นของบรรทัดอินพุต
แน่นอนว่า\cmdB{abc}\cmdB{abc}เอาท์พุต "abcabc" โดยไม่มีช่องว่างระหว่างสตริงย่อย "abc"
ในทางตรงกันข้าม\cmdA{abc}\cmdA{abc}เอาต์พุต "abc abc" ทำไม? ทั้งสองกรณีของ\cmdA{abc}แต่ละผลผลิต abc; ช่องว่างข้างหน้าจะabcอยู่ตรงนั้นเนื่องจากอักขระท้ายบรรทัดเดียว after \newcommand\cmdA[1]{ถูกแปลงเป็นช่องว่าง ช่องว่างที่เกิดจากอินสแตนซ์แรก\cmdA{abc}จะถูกละเว้นโดย TeX เนื่องจากเกิดขึ้นโดยการสันนิษฐานที่จุดเริ่มต้นของบรรทัด อย่างไรก็ตามช่องว่างที่เกิดจากอินสแตนซ์ที่สอง\cmdA{abc}ไม่ใช่ abc abcนั่นเป็นวิธีที่คุณท้ายด้วย
ภาคผนวกที่ได้รับแจ้งจากความคิดเห็นโดย @PhelypeOleinik: ผู้อ่านบางคนอาจได้รับความประทับใจจากการดูดซับการสนทนาก่อนหน้านี้ในขณะที่ไม่สามารถยุติบางบรรทัดที่อยู่ภายในกล่าวว่าคำจำกัดความมาโคร%อาจเป็นความผิดพลาดได้อย่างแน่นอนการยุติทุกบรรทัดภายในมาโครนั้น นิยามที่%ไม่เจ็บ น่าเสียดายที่นั่นอาจเป็นความผิดพลาด
ลองพิจารณาสิ่งต่อไปนี้เป็นตัวอย่างที่ได้รับการออกแบบมาแล้วค่อนข้างเป็นที่ยอมรับ มี 5 อินสแตนซ์%ซึ่งมีเพียงหนึ่งในนั้นที่สำคัญ:
\ifnum1=0%
1%
a%
\else%
b%
\fi
นี่\ifnum<u>=<v>เป็นเงื่อนไขที่ตรวจสอบไม่ว่าจะเป็น<u>และ<v>มีความเสมอภาคตัวเลข (ถ้าอย่างใดอย่างหนึ่ง<u>หรือ<v>ไม่ใช่ตัวเลขจะมีการออกข้อความแสดงข้อผิดพลาดและเพื่อแก้ไขแนวคิด: 1และ01มีค่าเท่ากันในเชิงตัวเลข)
สิ่งที่คุณจะคาดเดา (La) เท็กซ์ออกจะ: 1, 1a, aหรือb? ถ้าคุณเดาb- หลังจากทั้งหมด 1 ไม่เท่ากับ 0 แน่นอน ! - คุณคงเดาผิด aคำตอบที่ถูกต้องคือ ทำไม?
การปรากฏตัวของ%ตัวละครทันทีหลังจากที่\ifnum1=0กลืนอักขระท้ายบรรทัดที่มองไม่เห็น ดังนั้น TeX จะสแกนไปข้างหน้าจนกว่าจะพบอักขระที่ไม่ใช่ตัวเลขตัวแรกเพื่อตั้งค่าการทดสอบตามเงื่อนไข ดังนั้นเงื่อนไขที่ว่าจริงได้รับการประเมินโดยเท็กซ์คือ\ifnum1=01- จำไว้ว่าช่องว่างที่จุดเริ่มต้นของเส้นจะถูกละเว้น - ซึ่งเป็นความจริง นั่นเป็นเหตุผลที่aได้รับการเรียงพิมพ์
อย่างไรก็ตามหากมีคนเขียนอย่างใดอย่างหนึ่ง
\ifnum1=0
1%
a%
\else%
b%
\fi
หรือยังดีกว่า
\ifnum1=0
1
a
\else
b
\fi
คำตอบที่ถูกต้องbคือเนื่องจาก TeX จะ "เห็น" อักขระท้ายบรรทัดหลังจากนั้น\ifnum1=0ให้แปลงเป็นอักขระช่องว่างตระหนักว่าควรเริ่มประเมินว่า\ifnum1=0เป็นจริงหรือไม่และเลือกสาขาที่เหมาะสมของโครงสร้าง "ต้นไม้" ตามเงื่อนไข .