(La) TeX - อักขระ '%' ทำอะไร?

Oct 13 2020

%ตัวละครที่ดูเหมือนว่าจะมีจำนวนมากของใช้ จนถึงตอนนี้ฉันพบมันในสถานที่ต่อไปนี้:

  1. สำหรับการเขียนความคิดเห็น
% Schrodinger wave equation
$$\nabla^2\psi + \frac{8\pi^2m}{h^2}(E-V) = 0$$
  1. (ตรงนี้อาจจะผิด) สำหรับการแยกคำสั่งหลายบรรทัด (อ้างอิงที่นี่ )
\newcounter{bull}
\newcommand{\showbullcntr}[1]{%
\setcounter{bull}{#1}%
\bullcntr{bull}%
}
  1. ร่วมกับminipageเพื่อลบช่องว่างชั้นนำที่แทรก (ดัดแปลงจากคำถามนี้ )
\noindent
\begin{minipage}{0.5\linewidth}
   ...
\end{minipage}%
\begin{minipage}{0.5\linewidth}
   ...
\end{minipage}

ใครช่วยอธิบายโดยละเอียดเกี่ยวกับการใช้งานต่างๆของ%ตัวละครใน LaTeX ได้ไหม โดยเฉพาะอย่างยิ่งทำไมจึงใช้หลังจากอินสแตนซ์แรกของ\end{minipage}?

คำตอบ

92 Mico Oct 13 2020 at 07:14

ทั้งสามกรณีการใช้งานสำหรับ%ตัวอักษรที่คุณได้ระบุสามารถแบบครบวงจรในหนึ่งเดียวกรณีการใช้งานในช่วงโค้ง: หากต้องการยกเว้นทุกอย่างที่อยู่ในส่วนที่เหลือของสายการป้อนข้อมูลปัจจุบันจากการประมวลผลต่อไป

นี้ทุกอย่างประกอบด้วยความเห็นไม่เพียง แต่ (กรณีใช้งานครั้งแรกที่คุณกล่าวถึง) แต่ยังเป็นตัวละครที่สิ้นสุดของเส้นที่มองไม่เห็นที่ท้ายบรรทัดการป้อนข้อมูล ในความเป็นจริงหลังจากพบ%ตัวละครแล้ว 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เป็นจริงหรือไม่และเลือกสาขาที่เหมาะสมของโครงสร้าง "ต้นไม้" ตามเงื่อนไข .