Jak zmusić LaTeX do dzielenia wyrazów zawierających myślnik?

107

W dokumencie LaTeX, który piszę, otrzymuję przepełniony hbox ostrzeżenie w powodu słowa „multidyscyplinarny”, które jest renderowane na końcu wiersza.

Mogę pozbyć się tego konkretnego ostrzeżenia, zmieniając je na multi-discipli\-nary, ale ten sam problem wystąpi w innym miejscu, ponieważ to słowo jest często używane w artykule.

Chciałbym \hyphenation{}zamiast tego użyć polecenia, ale oczywiście mój wstępny \hyphenation{multi-disci-pli-na-ry}myślnik nie działa, ponieważ nie rozumie poprawnie pierwszej kreski.

Jakiej inkantacji potrzebuję, aby uzyskać prawidłowe wcięcie w słowie, które już zawiera myślnik?

Pytanie dodatkowe: Gdzie sam mogłem znaleźć odpowiedź na to pytanie?

Gyom
źródło
Dlaczego łamanie słowa na twardym myślniku jest problemem? Czy „wielowymiarowy / nowy wiersz” nie jest w porządku?
Geoff Reedy
1
Dodatkowa odpowiedź: wyszukiwanie w Google „dzielenia wyrazów w lateksie” przyniosło różnego rodzaju użyteczne wyniki, w tym lateksową książkę wiki, która zawiera odpowiedź: en.wikibooks.org/wiki/LaTeX/Formatting#Hyphenation
Mica
3
@mica: nie, nie ma. Czytałem te wszystkie strony lata temu. @geoff: byłoby dobrze, gdyby lateks był tam łączony. ale w tym przykładzie spowodowałoby to „niepełne hbox”, a lateks w ogóle nie dzielił wyrazów.
Gyom
czy możesz odwrócić ukośnik pierwszy - w poleceniu \ dzielenie wyrazów?
Brian Postow
1
Dzięki za komentarz @DrewSteen. Oczywiście się zgadzam. Ale w mojej obronie nie było czegoś takiego jak tex.SX, kiedy zadałem to pytanie :-)
Gyom

Odpowiedzi:

52

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

TeX nie dzieli wyrazów, które zostały już podzielone. Na przykład (karykaturalne) angielskie nazwisko Smyth-Postlethwaite nie jest dzielone, co może być kłopotliwe. To jest poprawny angielski styl składu (może nie być poprawny dla innych języków), ale jeśli zajdzie taka potrzeba, możesz zastąpić łącznik w nazwie \hyph poleceniem zdefiniowanym

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

Nie jest to rzecz, którą normalnie zalecałby ten FAQ… hyphenatPakiet definiuje zbiór takich poleceń (do wprowadzania punktów podziału przy różnych znakach interpunkcyjnych).


Lub możesz \newcommandużyć polecenia, które rozwija się do multi-discipli\-nary(użyj Wyszukaj + Zamień wszystko, aby zamienić istniejące słowa).

kennytm
źródło
Wielkie dzięki. Jak podejrzewałem, nie ma „idealnej” odpowiedzi. Ponieważ nie jestem jedynym autorem w tym dokumencie, tak naprawdę nie chcę zmuszać innych do używania \newcommandwszędzie (dlatego szukałem czegoś na podstawie \hyphenation). Domyślam się, że domyślnie zachowam to „tak jak jest” i dodam ręcznie wyraźne łączniki, gdy Latex narzeka na przepełnione hboxy.
Gyom
63

Problem (jak zauważył KennyTM) polega na tym, że LaTeX nie dzieli wyrazów z myślnikami. Na szczęście istnieje standardowy pakiet (część ncctools), który rozwiązuje ten właśnie problem, o nazwie extdash. Definiuje nowe polecenia dotyczące łączników i myślników, które nie zakłócają dzielenia wyrazów i które mogą zezwalać lub zapobiegać łamaniu linii w myślniku / myślniku. Wolę używać go z shortcutsopcją, więc mogę użyć np. \-/Zamiast\Hyphdash . Oto, czego chcesz:

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

Aby zapobiec łamaniu tego łącznika, użyj multi\=/disciplinary

(Na marginesie: The Chicago Manual of Style radzi porzucić łączniki z afiksami typu `` multi '', chyba że bez niego słowo jest niejednoznaczne lub niezrozumiałe).

Luke M.
źródło
To jest dobre, ale to daje ostrzeżenie hyperref kiedy używam go w ciąg rozdziału: Package hyperref Warning: Token not allowed in a PDF string. Tam inne proponowane rozwiązanie ( \def\hyph{-\penalty0\hskip0pt\relax}) działa.
Dr. Jan-Philip Gehrcke
1
@ Jan-PhilipGehrcke: te ostrzeżenia można również naprawić za pomocą \texorpdfstring(co zapewnia kompilację warunkową dla ciągów znaków, które trafiają do tytułów rozdziałów). Ukrywam zastosowania wewnątrz semantycznych makr (prawdopodobnie tutaj \multidisciplinary). Tak, to nie jest idealne.
Blaisorblade,
22

Używam pakietu, hyphenata następnie piszę słowa złożone, takie jak fińskie słowo Internet-yhteys (ang. Internet connection ) jako Internet\hyp yhteys. Wygląda głupkowato, ale wydaje się być najbardziej eleganckim sposobem, jaki znalazłem.

Zouppen
źródło
6

multi-disciplinarynie będą dzielone, jak wyjaśnia kennytm. Ale multi-\-disciplinaryma takie same możliwości dzielenia wyrazów comultidisciplinary .

Przyznaję, że nie wiem, dlaczego to działa. Różni się od opisanego tutaj zachowania (wyróżnienie moje):

Polecenie \-wstawia dyskrecjonalny łącznik do słowa. To również staje się jedynym punktem, w którym dzielenie wyrazów jest dozwolone w tym słowie .

rudolfbyker
źródło
Zastąpienie -przez -\-nie zmienia wyjścia, przynajmniej przy domyślnych ustawieniach w overleaf.com (prawdopodobnie pdflatex, ale na odwrocie nie ma tego właściwie).
Camille Goudeseune
4

Miałem ten sam problem. Używam łącznika oraz następującego makra:

\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

Zauważ, że używa to pakietu expl3 z latex3.

Sprawia, że -aktywna postać przeskanuje się do przodu, aby zobaczyć, czy następuje po niej więcej myślników. Jeśli tak, pozostaje -, aby upewnić się --i ---nadal działać. Jeśli nie, staje się\hyp poleceniem z łącznika, umożliwiając dzielenie wyrazów w pozostałej części słowa. Jest to ogólne rozwiązanie, które powoduje, że wszystkie wyrazy zawierające wyraźne łączniki są normalnie łączone.

Zwróć uwagę, że -staje się makrem, które nie jest w pełni rozwijalne, więc spróbuj dołączyć to po załadowaniu innych pakietów, które mogą nie oczekiwać -makra

Edycja: To jest moja druga wersja, pierwsza wersja była mniej rozbudowana, gdy znak {lub }następował po łączniku. Ten nie jest, ale w przeciwieństwie do pierwszej wersji -w tej wersji nie jest w pełni rozszerzalny.

JanKanis
źródło
3
multi\hskip0pt-\hskip0pt disciplinary

Możesz np. Zdefiniować polubienie

\def\:{\hskip0pt}

a potem napisz

multi\:-\:disciplinary

Zwróć uwagę, że pakiet języka rosyjskiego babel ma własny zestaw myślników, które nie zabraniają dzielenia wyrazów, "~na przykład (podwójny cudzysłów + tylda).

Michael
źródło
1
Powinien być multi-\hskip0pt disciplinary. Podobnie jak w tobie MWE, będzie zbytnio hipenować. Po prostu ustaw \setlength{\textwidth}{0.1cm}, aby spróbować.
LaRiFaRi
-3

Odpowiedziałem tutaj na coś podobnego: LaTeX rozbija zbyt wiele słów

Powiedziałem:

powinieneś umieścić gdzieś w preambule karę za dzielenie wyrazów:

\hyphenpenalty=750

Wartość 750 odpowiadała moim potrzebom w przypadku układu dwóch kolumn na papierze listowym (8,5 x 11 cali) z czcionką o rozmiarze 12 punktów. Dostosuj wartość do swoich potrzeb. Im wyższa liczba, tym mniej dzielenia wyrazów. Możesz również rzucić okiem na pakiet dzielenia, który zapewnia nieco więcej niż tylko karę za dzielenie wyrazów

Mika
źródło
1
Pyta, jak uniknąć dzielenia wyrazów, a nie jak zdefiniować granice.
Andras Gyomrey
-4

Aby uniknąć dzielenia wyrazów w już podzielonym wyrazie, użyłem nierozdzielającej spacji ~w połączeniu ze spacją wsteczną \!. Na przykład polecenie

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

użyte w tekście, pomiń dzielenie wyrazów w wyrazach 3-D. Prawdopodobnie nie jest to najlepsze rozwiązanie, ale zadziałało!

Igor
źródło
4
Odpowiada to na przeciwne pytanie, o co zostało zadane. Ponadto, jako osobę, która próbuje edytować swój post do tego stopnia, że się tam napisane, że jest to znacznie lepszy sposób, aby zrobić to, co zrobiłeś: \mbox{3-D}.
zwol