Làm cách nào để LaTeX gạch nối một từ có dấu gạch ngang?


107

Trong một tài liệu LaTeX Tôi đang viết, tôi nhận được một hbox rất đầy cảnh báo vì từ "đa ngành", trong đó xảy ra để được trả lại vào cuối của một dòng.

Tôi có thể loại bỏ cảnh báo cụ thể này bằng cách thay đổi nó thành multi-discipli\-nary, nhưng vấn đề tương tự sẽ xảy ra ở nơi khác, vì từ này được sử dụng rất nhiều trong báo cáo.

Tôi muốn sử dụng \hyphenation{}lệnh thay thế, nhưng rõ ràng là dự kiến ​​của tôi \hyphenation{multi-disci-pli-na-ry}không hoạt động, vì nó không hiểu chính xác dấu gạch ngang đầu tiên.

Tôi cần câu thần chú nào để thụt lề chính xác trong một từ đã có dấu gạch ngang?

Câu hỏi bổ sung: Tôi có thể tự tìm câu trả lời cho câu hỏi đó ở đâu?


Tại sao nó là một vấn đề cho từ bị phá vỡ ở dấu gạch nối cứng? Không phải là "đa chiều dòng mới" được không?
Geoff Reedy

1
Câu trả lời bổ sung: Một tìm kiếm trên google về "dấu gạch nối cao su" đã mang lại tất cả các loại kết quả hữu ích, bao gồm sách wiki cao su có câu trả lời: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica

3
@mica: không, không. Tôi đã đọc tất cả những trang đó từ nhiều năm trước. @geoff: sẽ ổn thôi, nếu latex có gạch nối ở đó. nhưng trong ví dụ này, nó sẽ gây ra "underfull hbox" và latex chọn hoàn toàn không gạch nối.
Gyom

bạn có thể gạch chéo ngược đầu tiên - trong lệnh \ gạch nối không?
Brian Postow

1
Cảm ơn nhận xét của bạn @DrewSteen. Rõ ràng là tôi đồng ý. Nhưng trong phòng của tôi không có những thứ như tex.SX trở lại khi tôi hỏi câu hỏi này :-)
Gyom

Câu trả lời:


52

Từ https://texfaq.org/FAQ-nohyph :

TeX sẽ không gạch nối một từ đã được gạch nối. Ví dụ, họ (biếm họa) tiếng Anh Smyth-Postlethwaite sẽ không gạch nối, điều này có thể gây rắc rối. Đây là kiểu sắp chữ tiếng Anh đúng (có thể không đúng với các ngôn ngữ khác), nhưng nếu cần, bạn có thể thay thế dấu gạch ngang trong tên bằng một \hyph lệnh, được xác định

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

Đây không phải là loại điều mà FAQ này thông thường sẽ khuyến nghị… hyphenatGói này xác định một nhóm các lệnh như vậy (để giới thiệu các dấu gạch nối ở các ký tự dấu câu khác nhau).


Hoặc bạn có thể \newcommandmột lệnh mở rộng thành multi-discipli\-nary(sử dụng Tìm kiếm + Thay thế Tất cả để thay thế các từ hiện có).


Cảm ơn rất nhiều. Như tôi đã nghi ngờ, không có câu trả lời "hoàn hảo". Bởi vì tôi không phải là tác giả duy nhất trong tài liệu đó, tôi không thực sự muốn ép những người khác sử dụng một tài liệu \newcommandở khắp mọi nơi (đó là lý do tại sao tôi đang tìm kiếm thứ gì đó dựa trên \hyphenation). Tôi đoán tôi sẽ chỉ giữ nó '' nguyên trạng '' theo mặc định và thêm dấu gạch nối rõ ràng theo cách thủ công khi Latex phàn nàn về các hộp quá đầy.
Gyom

63

Vấn đề (như KennyTM đã lưu ý) là LaTeX sẽ không gạch nối các từ với dấu gạch ngang trong chúng. May mắn thay, có một gói tiêu chuẩn (một phần của ncctools) giải quyết vấn đề đó, được gọi là extdash. Điều này xác định các lệnh gạch nối và gạch ngang mới không làm gián đoạn dấu gạch nối và có thể cho phép hoặc ngăn chặn ngắt dòng ở dấu gạch ngang / gạch ngang. Tôi thích sử dụng nó với shortcutstùy chọn hơn, vì vậy tôi có thể sử dụng, ví dụ, \-/hơn là\Hyphdash . Đây là những gì bạn muốn:

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

Để tránh bị vỡ ở dấu gạch nối đó, hãy sử dụng multi\=/disciplinary

(Bên cạnh: Sổ tay hướng dẫn phong cách Chicago khuyên bạn nên bỏ dấu gạch ngang gắn các phụ tố như 'multi', trừ khi từ đó không rõ ràng hoặc khó hiểu nếu không có nó.)


Đây là tuyệt vời, nhưng là mang lại một cảnh báo hyperref khi tôi sử dụng nó trong một chuỗi chương: Package hyperref Warning: Token not allowed in a PDF string. Ở đó, giải pháp được đề xuất khác ( \def\hyph{-\penalty0\hskip0pt\relax}) hoạt động.
Tiến sĩ Jan-Philip Gehrcke

1
@ Jan-PhilipGehrcke: những cảnh báo đó cũng có thể được sửa bằng cách sử dụng \texorpdfstring(cung cấp biên dịch có điều kiện cho các chuỗi đi vào tiêu đề chương). Tôi ẩn sử dụng bên trong macro ngữ nghĩa (ở đây, có thể là \multidisciplinary). Vâng, nó không hoàn hảo.
Blaisorblade, 21/07/17

22

Tôi sử dụng gói hyphenatvà sau đó viết các từ ghép như từ Phần Lan Internet-yhteys (tiếng Anh. Kết nối Internet ) như Internet\hyp yhteys. Trông có vẻ ngốc nghếch nhưng có vẻ là cách tao nhã nhất mà tôi tìm thấy.


6

multi-disciplinarysẽ không được gạch nối, như kennytm giải thích. Nhưng multi-\-disciplinarycó cùng cơ hội dấu gạch nốimultidisciplinary .

Tôi thừa nhận rằng tôi không biết tại sao nó hoạt động. Nó khác với hành vi được mô tả ở đây (tôi nhấn mạnh):

Lệnh \-chèn một dấu gạch nối tùy ý vào một từ. Đây cũng trở thành điểm duy nhất cho phép dấu gạch nối trong từ này .


Thay thế -bằng -\-không thay đổi kết quả đầu ra, ít nhất là với cài đặt mặc định trong overleaf.com (có thể là pdflatex, nhưng overleaf thực sự không nói).
Camille Goudeseune

4

Tôi đã từng gặp vấn đề tương tự. Tôi sử dụng dấu gạch nối cộng với macro sau:

\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

Lưu ý rằng điều này sử dụng gói bùng nổ từ latex3.

Nó làm cho -một ký tự hoạt động quét về phía trước để xem liệu nó có được theo sau bởi nhiều dấu gạch ngang hay không. Nếu vậy, nó vẫn là một -, để đảm bảo -----tiếp tục hoạt động. Nếu không, nó sẽ trở thành\hyp lệnh từ gạch nối, cho phép ngắt từ trong phần còn lại của từ. Đây là một giải pháp chung giúp tất cả các từ có chứa dấu gạch nối rõ ràng đều được gạch nối bình thường.

Lưu ý rằng nó -sẽ trở thành một macro không thể mở rộng hoàn toàn, vì vậy hãy cố gắng đưa nó vào sau khi tải các gói khác mà có thể không mong đợi -là macro

Chỉnh sửa: Đây là phiên bản thứ hai của tôi, phiên bản đầu tiên kém mạnh mẽ hơn khi có dấu gạch ngang {hoặc }theo sau. Cái này thì không, nhưng không giống như phiên bản đầu tiên, phiên bản -này không thể mở rộng hoàn toàn.


3
multi\hskip0pt-\hskip0pt disciplinary

Ví dụ, bạn có thể xác định như

\def\:{\hskip0pt}

và sau đó viết

multi\:-\:disciplinary

Lưu ý rằng gói ngôn ngữ tiếng Nga babel có bộ dấu gạch ngang riêng không cấm dấu gạch nối, chẳng hạn "~(dấu ngoặc kép + dấu ngã).


1
Nên multi-\hskip0pt disciplinary. Giống như ở bạn MWE, nó sẽ cường điệu quá mức. Chỉ cần thiết lập \setlength{\textwidth}{0.1cm}để thử điều đó.
LaRiFaRi

-3

Tôi đã trả lời một điều tương tự ở đây: LaTeX chia quá nhiều từ

Tôi đã nói:

bạn nên đặt một hình phạt gạch nối ở đâu đó trong phần mở đầu của mình:

\hyphenpenalty=750

Giá trị 750 phù hợp với nhu cầu của tôi về bố cục hai cột trên giấy viết thư (8,5x11 in) với phông chữ 12 pt. Điều chỉnh giá trị cho phù hợp với nhu cầu của bạn. Con số càng cao, dấu gạch nối càng ít xảy ra. Bạn cũng có thể muốn xem gói gạch nối, nó cung cấp nhiều hơn một chút so với hình phạt gạch nối


1
Anh ấy đang hỏi làm thế nào để tránh gạch nối chứ không phải về cách xác định giới hạn.
Andras Gyomrey

-4

Để tránh gạch nối trong từ đã được gạch nối, tôi đã sử dụng dấu cách không ngắt ~kết hợp với dấu cách lùi \!. Ví dụ, lệnh

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

được sử dụng trong văn bản, loại bỏ dấu gạch nối trong từ 3-D. Có lẽ không phải là giải pháp tốt nhất, nhưng nó đã hiệu quả với tôi!


4
Đây là câu trả lời cho câu hỏi ngược lại với những gì đã được hỏi. Ngoài ra, như người đã cố gắng để chỉnh sửa bài viết của bạn đến thời điểm đó ra nói, có một cách tốt hơn nhiều để làm những gì bạn đã làm: \mbox{3-D}.
zwol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.