Jaký je název, jaký je rozdíl mezi a ~?
Po kompilaci nevidím žádné rozdíly.
MWE:
\documentclass[a4paper]{article} \usepackage[english]{babel} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage{graphicx} \usepackage[colorinlistoftodos]{todonotes} \title{Your Paper} \author{You} \date{\today} \begin{document} \maketitle I am cool. I~am~cool. \end{document}
Komentáře
Odpovědět
Rozdíl je vidět na konci řádku. Prostor je rozbitný a ~ je nerozbitný prostor.
\documentclass[a4paper]{article} \usepackage[english]{babel} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage{graphicx} \usepackage[colorinlistoftodos]{todonotes} \title{Your Paper} \author{You} \date{\today} \begin{document} \maketitle \hspace*{0.9\textwidth}I am cool. \hspace*{0.9\textwidth}I~am~cool. \end{document}
Tři slova I am a cool jsou ve druhém řádku slepeny dohromady.
Odpověď
~ je aktivní znak , což znamená, že je to stejné jako makro jako \mbox atd. Jeho funkce je popsána jeho definice, která je
\nobreakspace{}
, takže psaní ~ je ekvivalentní psaní \nobreakspace{}.
Co \nobreakspace dělá? Tady je:
\leavevmode\nobreak\
(za posledním zpětným lomítkem následuje mezera). Odstavec je tedy spuštěn nebo se nic neudělá, pokud již jsme v odstavci (\leavevmode); poté se vydá \nobreak, který zakáže jakékoli zalomení řádku v bodě (\nobreak) a poté se vloží normální mezerový prostor.
Tudíž při psaní
no~break
bude mezi dvěma slovy mezera, ale po .
Proč {} po \nobreakspace? Pokud máte no~break v titulku, v souboru .aux se zobrazí rozšířená verze
no\nobreakspace {}break
Závorky byly zavedeny pro zvládnutí ojedinělého případu, kdy je požadována mezera za ~; bez nich by no~ break psal
no\nobreakspace break
a po přečtení .aux soubor, prostor bude ignorován. S složenými závorkami
no\nobreakspace {} break
bude zapsán a další prostor nebude ignorován.
Co se stane, když jeden zadá no~ break ve výstupu? Přidají se dvě mezery, ale není u nich možné zalomení řádku, protože mezera je proveditelným bodem zalomení čáry, pouze pokud jí nepředchází vyřazitelná položka; protože \nobreakspace se stává
\leavevmode\penalty 10000 \
a pokuty jsou vyřazitelné jako mezery, ani \ ani následující mezeru nelze použít pro zalomení řádku.
V opačném případě no ~break jsou vydány dva mezery, ale nyní je možný bod zlomu na prvním místě (a oba zmizí spolu s pokutou v případě, že bude uplatněna).
Komentáře
- Pěkné vysvětlení. Mohu říci +1?
- Mluvíte o
no~ break, ale ne ono ~break. V konkrétním případě se tento případ může objevit, když použijete omezení znaků na řádek s návratem řádku v prostoru. Co se stane v tomto případě? - @RomainPicot Téměř totéž, dostanete dvě mezery, pokud nedojde k žádné přestávce, ale přestávka je možná (což není u
no~ break) - @egreg děkuji za přesnost
;-) - @RomainPicot jsem přidal závěrečnou poznámku, děkuji za výzvu.
Odpověď
Toto je definice ~ v latex.ltx
\catcode `\~=13 \def~{\nobreakspace{}}
zatímco \nobreakspace je definován jako
\DeclareRobustCommand{\nobreakspace}{% \leavevmode\nobreak\ }
Takže aktivní znak ~ odpovídá prostoru, který nelze rozdělit na řádky.
~je nerozbitný prostor, kde jako prostor není ' t nerozbitný.:p\the....příkazu výstupu čítače.~=\nobreakspace