Bagaimana cara membuat LaTeX memberi tanda hubung pada kata yang berisi tanda hubung?

107

Dalam dokumen LaTeX yang saya tulis, saya mendapatkan peringatan hbox yang berlebihan karena kata "multi-disiplin", yang kebetulan ditampilkan di akhir baris.

Saya dapat menghilangkan peringatan khusus ini dengan mengubahnya menjadi multi-discipli\-nary, tetapi masalah yang sama akan terjadi di tempat lain, karena kata ini banyak digunakan di koran.

Saya ingin menggunakan \hyphenation{}perintah sebagai gantinya, tetapi jelas tentatif saya \hyphenation{multi-disci-pli-na-ry}tidak berfungsi, karena tidak memahami tanda hubung pertama dengan benar.

Mantra apa yang saya perlukan untuk mendapatkan lekukan yang benar pada kata yang sudah mengandung tanda hubung?

Pertanyaan bonus: Di manakah saya dapat menemukan jawaban untuk pertanyaan itu sendiri?

Gyom
sumber
Mengapa menjadi masalah bagi kata untuk dipecahkan pada tanda hubung yang keras? Bukankah "multi- \ newline dimensional" oke?
Geoff Reedy
1
Jawaban bonus: Pencarian "tanda hubung lateks" di Google menghasilkan semua jenis hasil yang berguna, termasuk buku wiki lateks yang memiliki jawaban: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica
3
@ mica: tidak. Saya telah membaca semua halaman itu bertahun-tahun yang lalu. @geoff: akan baik-baik saja, jika lateks membuat tanda hubung di sana. tetapi dalam contoh ini akan menyebabkan "underfull hbox", dan latex memilih untuk tidak menggunakan tanda hubung sama sekali.
Gyom
dapatkah Anda membuat garis miring terbalik yang pertama - dalam perintah \ tanda hubung?
Brian Postow
1
Terima kasih atas komentar Anda @DrewSteen. Jelas saya setuju. Tetapi dalam pembelaan saya tidak ada yang namanya tex.SX ketika saya mengajukan pertanyaan ini :-)
Gyom

Jawaban:

52

Dari https://texfaq.org/FAQ-nohyph :

TeX tidak akan memenggal kata yang sudah diberi tanda hubung. Misalnya, nama belakang (karikatur) bahasa Inggris Smyth-Postlethwaite tidak akan diberi tanda hubung, yang bisa merepotkan. Ini adalah gaya penyusunan huruf Inggris yang benar (mungkin tidak tepat untuk bahasa lain), tetapi jika perlu, Anda dapat mengganti tanda hubung dalam nama dengan \hyph perintah, yang ditentukan

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

Ini bukanlah jenis hal yang biasanya direkomendasikan oleh FAQ ini… hyphenatPaket ini mendefinisikan sekumpulan perintah seperti itu (untuk memasukkan titik hubung pada berbagai karakter tanda baca).


Atau Anda dapat \newcommandmenggunakan perintah yang diperluas ke multi-discipli\-nary(gunakan Search + Replace All untuk mengganti kata yang ada).

kennytm
sumber
Terima kasih banyak. Seperti yang saya duga, tidak ada jawaban yang "sempurna". Karena saya bukan satu-satunya penulis dalam dokumen itu, saya tidak benar-benar ingin memaksa orang lain untuk menggunakan a di \newcommandmana - mana (itulah mengapa saya mencari sesuatu berdasarkan \hyphenation). Saya kira saya akan menyimpannya '' sebagaimana adanya '' secara default, dan menambahkan tanda hubung eksplisit secara manual ketika Latex mengeluh tentang hbox yang terlalu penuh.
Gyom
63

Masalahnya (seperti yang dicatat KennyTM) adalah bahwa LaTeX tidak akan memenggal kata-kata dengan tanda hubung di dalamnya. Untungnya, ada paket standar (bagian dari ncctools) yang mengatasi masalah itu, bernama extdash. Ini mendefinisikan perintah tanda hubung dan tanda hubung baru yang tidak mengganggu tanda hubung, dan yang dapat mengizinkan atau mencegah jeda baris pada tanda hubung / tanda hubung. Saya lebih suka menggunakannya dengan shortcutsopsi, jadi saya bisa menggunakan, misalnya, \-/daripada \Hyphdash. Inilah yang Anda inginkan:

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

Untuk mencegah putusnya tanda hubung itu, gunakan multi\=/disciplinary

(Selain: The Chicago Manual of Style menyarankan untuk menghilangkan tanda hubung yang melampirkan imbuhan seperti 'multi', kecuali kata tersebut ambigu atau tidak dapat dipahami tanpanya.)

Luke M
sumber
Ini bagus, tetapi menghasilkan peringatan hyperref ketika saya menggunakannya dalam string bab: Package hyperref Warning: Token not allowed in a PDF string. Di sana, solusi lain yang diusulkan ( \def\hyph{-\penalty0\hskip0pt\relax}) berfungsi.
Dr. Jan-Philip Gehrcke
1
@ Jan-PhilipGehrcke: peringatan itu juga bisa diperbaiki menggunakan \texorpdfstring(yang menyediakan kompilasi bersyarat untuk string yang masuk ke judul bab). Saya menyembunyikan penggunaan di dalam makro semantik (di sini, mungkin \multidisciplinary). Ya, itu tidak sempurna.
Blaisorblade
22

Saya menggunakan paket hyphenatdan kemudian menulis kata majemuk seperti kata Finlandia Internet-yhteys (Inggris. Koneksi Internet ) sebagai Internet\hyp yhteys. Tampak konyol, tetapi tampaknya cara paling elegan yang pernah saya temukan.

Zouppen
sumber
6

multi-disciplinarytidak akan diberi tanda hubung, seperti yang dijelaskan oleh kennytm. Tetapi multi-\-disciplinarymemiliki peluang pemenggalan yang sama yang multidisciplinarydimilikinya.

Saya akui bahwa saya tidak tahu mengapa ini berhasil. Ini berbeda dari perilaku yang dijelaskan di sini (penekanan saya):

Perintah tersebut \-memasukkan tanda hubung pilihan ke dalam sebuah kata. Ini juga menjadi satu-satunya titik di mana tanda hubung diperbolehkan dalam kata ini .

rudolfbyker
sumber
Mengganti -dengan -\-tidak mengubah output, setidaknya dengan pengaturan default di overleaf.com (mungkin pdflatex, tetapi halaman lebih tidak benar-benar mengatakannya).
Camille Goudeseune
4

Saya memiliki masalah yang sama. Saya menggunakan tanda hubung plus makro berikut:

\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

Perhatikan bahwa ini menggunakan paket expl3 dari latex3.

Itu membuat -karakter aktif yang memindai ke depan untuk melihat apakah diikuti oleh lebih banyak tanda hubung. Jika demikian, itu tetap a -, untuk memastikan --dan ---tetap bekerja. Jika tidak, ini menjadi \hypperintah dari tanda hubung, memungkinkan pemisah kata di seluruh kata. Ini adalah solusi umum yang membuat semua kata yang berisi tanda hubung eksplisit diberi tanda hubung secara normal.

Perhatikan itu -menjadi makro yang tidak dapat diperluas sepenuhnya, jadi coba sertakan ini setelah memuat paket lain yang mungkin tidak diharapkan -menjadi makro

Sunting: Ini adalah versi kedua saya, versi pertama kurang kuat ketika {atau }diikuti tanda hubung. Yang ini bukan, tetapi tidak seperti versi pertama, -versi ini tidak dapat diperluas sepenuhnya.

JanKanis
sumber
3
multi\hskip0pt-\hskip0pt disciplinary

Misalnya Anda dapat mendefinisikan suka

\def\:{\hskip0pt}

dan kemudian menulis

multi\:-\:disciplinary

Perhatikan bahwa paket bahasa Rusia babel memiliki set tanda hubung sendiri yang tidak melarang tanda hubung, "~(tanda kutip ganda + tanda gelombang) misalnya.

Michael
sumber
1
Seharusnya multi-\hskip0pt disciplinary. Seperti di MWE Anda, itu akan terlalu banyak menghipen. Atur saja \setlength{\textwidth}{0.1cm}untuk mencobanya.
LaRiFaRi
-3

Saya menjawab sesuatu yang serupa di sini: LaTeX memecah terlalu banyak kata

Saya bilang:

Anda harus menetapkan hukuman tanda hubung di suatu tempat di pembukaan Anda:

\hyphenpenalty=750

Nilai 750 sesuai dengan kebutuhan saya akan tata letak dua kolom di atas kertas surat (8,5x11 in) dengan font 12 pt. Sesuaikan nilainya dengan kebutuhan Anda. Semakin tinggi angkanya, semakin sedikit tanda hubung yang terjadi. Anda mungkin juga ingin melihat paket tanda hubung, ini memberikan sedikit lebih dari sekadar hukuman tanda hubung

Mika
sumber
1
Dia menanyakan bagaimana menghindari tanda hubung, bukan tentang bagaimana mendefinisikan batasan.
Andras Gyomrey
-4

Untuk menghindari tanda hubung pada kata yang sudah diberi tanda hubung, saya menggunakan spasi non-breaking ~dalam kombinasi dengan spasi mundur \!. Misalnya, perintah

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

digunakan dalam teks, tekan tanda hubung di kata 3-D. Mungkin bukan solusi terbaik, tetapi berhasil untuk saya!

Igor
sumber
4
Ini menjawab pertanyaan berlawanan dari apa yang ditanyakan. Juga, sebagai orang yang mencoba untuk mengedit posting Anda ke titik itu keluar kata, ada banyak cara yang lebih baik untuk melakukan apa yang Anda lakukan: \mbox{3-D}.
zwol