ฉันจะทำให้ LaTeX ยัติภังค์คำที่มีเครื่องหมายขีดกลางได้อย่างไร


107

ในเอกสาร LaTeX ที่ฉันกำลังเขียนฉันได้รับคำเตือนเกี่ยวกับhbox ที่มากเกินไปเนื่องจากคำว่า "หลายสาขาวิชา" ซึ่งจะแสดงที่ท้ายบรรทัด

ฉันสามารถกำจัดคำเตือนนี้ได้โดยเปลี่ยนเป็นmulti-discipli\-naryแต่ปัญหาเดียวกันนี้จะเกิดขึ้นที่อื่นเนื่องจากมีการใช้คำนี้มากในกระดาษ

ฉันต้องการใช้\hyphenation{}คำสั่งแทน แต่เห็นได้ชัดว่าฉัน\hyphenation{multi-disci-pli-na-ry}ไม่สามารถใช้งานได้เนื่องจากไม่เข้าใจขีดแรกอย่างถูกต้อง

ฉันต้องใช้คาถาอะไรเพื่อให้การเยื้องถูกต้องในคำที่มีเส้นประอยู่แล้ว

คำถามโบนัส: ฉันจะหาคำตอบสำหรับคำถามนั้นด้วยตัวเองได้ที่ไหน?


เหตุใดจึงมีปัญหาสำหรับคำที่จะหักที่เครื่องหมายขีดกลาง? "หลายมิติบรรทัดใหม่" ไม่เป็นไร
Geoff Reedy

1
คำตอบโบนัส: การค้นหา "ยัติภังค์น้ำยาง" โดย Google ให้ผลลัพธ์ที่เป็นประโยชน์ทุกประเภทรวมถึงหนังสือวิกิน้ำยางซึ่งมีคำตอบ: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica

3
@mica: ไม่มันไม่ ฉันได้อ่านทุกหน้าเมื่อหลายปีก่อน @geoff: มันจะโอเคแน่นอนถ้าลาเท็กซ์ทำยัติภังค์ที่นั่น แต่ในตัวอย่างนี้จะทำให้เกิด "hbox ต่ำเกินไป" และลาเท็กซ์เลือกที่จะไม่ใส่ยัติภังค์เลย
Gyom

คุณสามารถแบ็กสแลชตัวแรกในคำสั่ง \ ยัติภังค์ได้หรือไม่
Brian Postow

1
ขอบคุณสำหรับความคิดเห็นของคุณ @DrewSteen เห็นได้ชัดว่าฉันเห็นด้วย แต่ในการป้องกันของฉันไม่มีสิ่งที่เรียกว่า tex.SX เมื่อฉันถามคำถามนี้ :-)
Gyom

คำตอบ:


52

จากhttps://texfaq.org/FAQ-nohyph :

TeX จะไม่ยัติภังค์ของคำที่มีการยัติภังค์อยู่แล้ว ตัวอย่างเช่นนามสกุลภาษาอังกฤษ (ภาพล้อเลียน) Smyth-Postlethwaite จะไม่ใส่ยัติภังค์ซึ่งอาจเป็นปัญหา นี่คือรูปแบบการเรียงพิมพ์ภาษาอังกฤษที่ถูกต้อง (อาจไม่ถูกต้องสำหรับภาษาอื่น) แต่หากจำเป็นต้องใช้คุณสามารถแทนที่ยัติภังค์ในชื่อด้วย\hyph คำสั่งที่กำหนด

 \def\hyph{-\penalty0\hskip0pt\relax}

นี่ไม่ใช่ประเภทของสิ่งที่คำถามที่พบบ่อยมักจะแนะนำโดยทั่วไป… hyphenatแพคเกจกำหนดกลุ่มของคำสั่งดังกล่าว (สำหรับการแนะนำจุดยัติภังค์ที่อักขระเครื่องหมายวรรคตอนต่างๆ)


หรือคุณอาจ\newcommandใช้คำสั่งที่ขยายเป็นmulti-discipli\-nary(ใช้ Search + Replace All เพื่อแทนที่คำที่มีอยู่)


ขอบคุณมาก. ตามที่ฉันสงสัยไม่มีคำตอบที่ "สมบูรณ์แบบ" เนื่องจากฉันไม่ใช่ผู้เขียนเพียงคนเดียวในเอกสารนั้นฉันจึงไม่ต้องการบังคับให้คนอื่นใช้\newcommandทุกที่ (นั่นคือเหตุผลที่ฉันกำลังมองหาบางสิ่งบางอย่างตาม\hyphenation) ฉันเดาว่าฉันจะคงไว้ '' ตามที่เป็นอยู่ '' ตามค่าเริ่มต้นและเพิ่มยัติภังค์ที่ชัดเจนด้วยตนเองเมื่อ Latex บ่นเกี่ยวกับ hboxes ที่มากเกินไป
Gyom

63

ปัญหา (ตามที่ Kenny ™ตั้งข้อสังเกต) คือ LaTeX จะไม่ใส่ยัติภังค์โดยมีเครื่องหมายขีดกลาง โชคดีที่มีแพ็คเกจมาตรฐาน (ส่วนหนึ่งของ ncctools) ที่จัดการกับปัญหานั้นเรียกว่าextdash. สิ่งนี้กำหนดคำสั่งยัติภังค์และเส้นประใหม่ที่ไม่รบกวนการยัติภังค์และคำสั่งใดที่สามารถอนุญาตหรือป้องกันการแบ่งบรรทัดที่ยัติภังค์ / เส้นประ ฉันชอบใช้กับshortcutsตัวเลือกนี้ดังนั้นฉันจึงสามารถใช้เช่น\-/แทนที่จะเป็น\Hyphdashมากกว่านี่คือสิ่งที่คุณต้องการ:

\usepackage[shortcuts]{extdash} ... multi\-/disciplinary

เพื่อป้องกันการแตกที่ยัติภังค์นั้นให้ใช้ multi\=/disciplinary

(นอกเหนือจาก: คู่มือการใช้รูปแบบของชิคาโกแนะนำให้วางยัติภังค์ที่ติดคำว่า "หลาย" เว้นแต่คำนั้นจะคลุมเครือหรือไม่เข้าใจหากไม่มีคำนั้น)


นี้เป็นที่ดี แต่เป็นอัตราผลตอบแทนเตือน hyperref Package hyperref Warning: Token not allowed in a PDF stringเมื่อฉันใช้มันในสตริงบท: ที่นั่นโซลูชันอื่น ๆ ที่เสนอ ( \def\hyph{-\penalty0\hskip0pt\relax}) ใช้ได้ผล
Dr. Jan-Philip Gehrcke

1
@ Jan-PhilipGehrcke: คำเตือนเหล่านั้นสามารถแก้ไขได้โดยใช้\texorpdfstring(ซึ่งจัดเตรียมการรวบรวมแบบมีเงื่อนไขสำหรับสตริงที่เข้าสู่ชื่อบท) ฉันซ่อนใช้ในมาโครความหมาย (ที่นี่อาจ\multidisciplinary) ใช่มันไม่สมบูรณ์แบบ
Blaisorblade

22

ผมใช้แพคเกจhyphenatแล้วเขียนคำประสมเช่นคำฟินแลนด์อินเทอร์เน็ต yhteys (Eng. การเชื่อมต่ออินเทอร์เน็ต ) Internet\hyp yhteysในฐานะ ดูน่าขำ แต่ดูเหมือนจะเป็นวิธีที่ดีที่สุดที่ฉันเคยพบ


6

multi-disciplinaryจะไม่ถูกยัติภังค์ตามที่อธิบายโดย kennytm แต่multi-\-disciplinaryมีโอกาสในการยัติภังค์เหมือนกันที่multidisciplinaryมี

ฉันยอมรับว่าฉันไม่รู้ว่าทำไมถึงได้ผล มันแตกต่างจากพฤติกรรมที่อธิบายไว้ที่นี่ (เน้นของฉัน):

คำสั่ง \-จะแทรกยัติภังค์ตามดุลยพินิจลงในคำ นอกจากนี้ยังกลายเป็นจุดเดียวที่อนุญาตให้ใส่ยัติภังค์ในคำนี้


1
การแทนที่-ด้วย-\-ไม่ได้เปลี่ยนผลลัพธ์อย่างน้อยก็ด้วยการตั้งค่าเริ่มต้นใน overleaf.com (อาจเป็น pdflatex แต่ overleaf ไม่ได้พูดจริง)
Camille Goudeseune

4

ผมมีปัญหาเหมือนกัน. ฉันใช้ยัติภังค์บวกมาโครต่อไปนี้:

\RequirePackage{hyphenat}
\RequirePackage{expl3}


% The following defs make sure words that contain an explicit `-` (hyphen) are still hyphenated the normal way, and double- and triple hyphens keep working the way they should. Just don't use a `-` as the last token of your document. Also note that `-` is now a macro that is not fully expandable

\ExplSyntaxOn

% latex2e doesn't like commands starting with 'end', apparently expl3 doesn't have any problems with it
\cs_new:Npn \hyphenfix_emdash:c {---}
\cs_new:Npn \hyphenfix_endash:c {--}

\cs_new:Npn \hyphenfix_discardnext:NN #1#2{#1}


\catcode`\-=\active

\cs_new_protected:Npn -{
    \futurelet\hyphenfix_nexttok\hyphenfix_i:w
}

\cs_new:Npn \hyphenfix_i:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        %discard the next `-` token
        \hyphenfix_discardnext:NN{\futurelet\hyphenfix_nexttok\hyphenfix_ii:w}
    }{
        % from package hyphenat
        \hyp
    }
}

\cs_new:Npn \hyphenfix_ii:w {
    \cs_if_eq:NNTF{\hyphenfix_nexttok}{-}{
        \hyphenfix_discardnext:NN{\hyphenfix_emdash:c}
    }{
        \hyphenfix_endash:c
    }
}


\ExplSyntaxOff

โปรดทราบว่าสิ่งนี้ใช้แพ็คเกจ Expl3 จาก latex3

ทำให้-อักขระที่ใช้งานอยู่ซึ่งจะสแกนไปข้างหน้าเพื่อดูว่าตามด้วยขีดกลางมากขึ้นหรือไม่ ถ้าเป็นเช่นนั้นก็ยังคงเป็น-เพื่อให้แน่ใจ--และ---ทำงานต่อไป ถ้าไม่มันจะกลายเป็นไฟล์\hypคำสั่งจากยัติภังค์โดยเปิดใช้การแบ่งคำในส่วนที่เหลือของคำ นี่เป็นวิธีแก้ปัญหาทั่วไปที่ทำให้ทุกคำที่มีขีดกลางที่ชัดเจนตามปกติ

โปรดทราบว่า-จะกลายเป็นมาโครที่ไม่สามารถขยายได้อย่างสมบูรณ์ดังนั้นลองรวมสิ่งนี้ไว้หลังจากโหลดแพ็คเกจอื่น ๆ ที่อาจไม่คาดว่า-จะเป็นมาโคร

แก้ไข:นี่เป็นเวอร์ชันที่สองของฉันเวอร์ชันแรกมีประสิทธิภาพน้อยกว่าเมื่อมี{หรือ}ตามด้วยยัติภังค์ อันนี้ไม่ใช่ แต่แตกต่างจากเวอร์ชันแรกที่-ในเวอร์ชันนี้ไม่สามารถขยายได้เต็มที่


3
multi\hskip0pt-\hskip0pt disciplinary

คุณสามารถกำหนดเช่น

\def\:{\hskip0pt}

แล้วเขียน

multi\:-\:disciplinary

โปรดทราบว่าชุดภาษารัสเซียของบาเบลมีชุดขีดกลางของตัวเองที่ไม่ห้ามการใส่ยัติภังค์"~(อัญประกาศคู่ + เครื่องหมายทิลเดอ)


1
multi-\hskip0pt disciplinaryควรจะเป็น เช่นเดียวกับในคุณ MWE มันจะยัติภังค์มากเกินไป เพียงแค่ตั้งค่า\setlength{\textwidth}{0.1cm}เพื่อที่จะลอง
LaRiFaRi

-3

ฉันตอบสิ่งที่คล้ายกันที่นี่: LaTeX ทำลายคำมากเกินไป

ฉันพูดว่า:

คุณควรกำหนดโทษยัติภังค์ไว้ที่ใดที่หนึ่งในคำนำของคุณ:

\hyphenpenalty=750

ค่า 750 เหมาะกับความต้องการของฉันสำหรับการจัดวางสองคอลัมน์บนกระดาษ Letter (8.5x11 นิ้ว) พร้อมฟอนต์ 12 pt ปรับค่าให้เหมาะกับความต้องการของคุณ ยิ่งตัวเลขสูงก็จะเกิดการยัติภังค์น้อยลง คุณอาจต้องการดูที่ยัติภังค์แพคเกจซึ่งให้โทษมากกว่าการใส่ยัติภังค์เล็กน้อย


1
เขากำลังถามถึงวิธีหลีกเลี่ยงการยัติภังค์ไม่ใช่เกี่ยวกับวิธีกำหนดขีด จำกัด
Andras Gyomrey

-4

เพื่อหลีกเลี่ยงการอยู่ในคำยัติภังค์ยัติภังค์แล้วผมใช้พื้นที่ที่ไม่ทำลายในการรวมกันมีพื้นที่ย้อนหลัง~ \!ตัวอย่างเช่นคำสั่ง

3~\!\!\!\!-~\!\!\!D

ใช้ในข้อความไม่ให้ใส่ยัติภังค์ในคำว่า 3-D อาจไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด แต่ได้ผลสำหรับฉัน!


4
นี่เป็นการตอบคำถามที่ตรงกันข้ามกับสิ่งที่ถูกถาม \mbox{3-D}นอกจากนี้ยังเป็นคนที่พยายามที่จะแก้ไขโพสต์ของคุณไปยังจุดที่ออกมากล่าวว่ามีวิธีที่ดีกว่ามากที่จะทำสิ่งที่คุณทำ:
zwol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.