(La) TeX - Co robi znak „%”?
%charakter wydaje się mieć wiele zastosowań. Do tej pory spotkałem się z tym w następujących miejscach:
- Do pisania komentarzy
% Schrodinger wave equation
$$\nabla^2\psi + \frac{8\pi^2m}{h^2}(E-V) = 0$$
- (Mogę się tutaj mylić) Do dzielenia poleceń na wiele linii (odniesienie tutaj )
\newcounter{bull}
\newcommand{\showbullcntr}[1]{%
\setcounter{bull}{#1}%
\bullcntr{bull}%
}
- W połączeniu z
minipage, aby usunąć wstawioną wiodącą spację (dostosowaną z tego pytania)
\noindent
\begin{minipage}{0.5\linewidth}
...
\end{minipage}%
\begin{minipage}{0.5\linewidth}
...
\end{minipage}
Czy ktoś mógłby szczegółowo wyjaśnić różne zastosowania %postaci w LaTeX? W szczególności, dlaczego jest używany po pierwszym wystąpieniu \end{minipage}?
Odpowiedzi
Trzy przypadki użycia dla wymienionego %znaku można ujednolicić w jednym, nadrzędnym przypadku użycia: aby wykluczyć wszystko, co znajduje się w pozostałej części bieżącego wiersza wejściowego, z dalszego przetwarzania .
To wszystko zawiera nie tylko komentarze (pierwszy wspomniany przypadek użycia), ale także niewidoczny znak końca linii na końcu linii wejściowej. W rzeczywistości, po napotkaniu %znaku, TeX zignoruje również wszelkie białe spacje, które mogą znajdować się na początku następnej linii. W rzeczywistości białe znaki na początku wiersza wejściowego są zawsze ignorowane, niezależnie od tego, czy poprzedni wiersz został zakończony, czy nie %. Cóż, tryb dosłowny jest wyjątkiem, ale to temat na inną dyskusję.
A zatem,
Hello %
World
i
Hello %
World
kończą się przetwarzaniem w ten sam sposób: TeX czyta Hello z pierwszej linii (z uwzględnieniem spacji po "Hello") iz Worlddrugiej linii i wyświetli "Hello World". Zauważ, że znak końca linii na końcu pierwszej linii i cztery białe znaki na początku drugiej linii zostały odrzucone.
Co by się stało, gdyby dane wejściowe były
Hello%
World
Wynik będzie teraz „HelloWorld”. Czemu? Cóż, tak jak poprzednio, znak końca wiersza na końcu pierwszego wiersza i cztery białe znaki na początku drugiego wiersza są odrzucane, a to, co zostało, to „Hello” z pierwszego wiersza i „World” od drugiego.
Jeszcze jedna informacja: pojedynczy znak końca linii jest konwertowany podczas pierwszej fazy przetwarzania TeX-a do białych znaków. (W przeciwieństwie do tego, dwa lub więcej kolejnych znaków końca linii jest konwertowanych na \partoken).
Hello
World
i
Hello World
utworzyć ten sam wynik.
Wyposażeni w te informacje, jesteśmy w stanie dowiedzieć się, jaki jest cel %znaku w poniższym fragmencie kodu:
\noindent
\begin{minipage}{0.5\textwidth}
...
\end{minipage}%
\begin{minipage}{0.5\textwidth}
...
\end{minipage}
Całkowita szerokość tej konstrukcji to 0.5\textwidth+0.5\textwidth=1\textwidth. Gdyby %pominięto znak, znak końca linii po pierwszym wystąpieniu \end{minipage}zostałby przekonwertowany na biały znak, a całkowita szerokość byłaby 1\textwidth dodana do szerokości znaku spacji . Prawie na pewno nie jest to pożądane. Zwróć również uwagę, że ważne było umieszczenie %znaku zaraz po \end{minipage}; pisanie \end{minipage} %nie służyłoby zamierzonemu celowi.
Następnie rozważ następujące dwie definicje makr:
\newcommand\cmdA[1]{
#1}
\newcommand\cmdB[1]{%
#1}
Obie definicje są legalne. W szczególności nie jest absolutnie konieczne, z czysto składniowego punktu widzenia, podanie %znaku po \newcommand\cmdA[1]{w celu skompilowania makra. Ale to nie znaczy, że te dwa makra dają ten sam wynik. Czy możesz zgadnąć, co \cmdA{abc}\cmdA{abc}i co \cmdB{abc}\cmdB{abc}wyjdzie? Dla uproszczenia należy założyć, że obie sekwencje poleceń występują na początku wiersza wejściowego.
Oczywiście, \cmdB{abc}\cmdB{abc}wyświetla „abcabc”, bez spacji między podłańcuchami „abc”.
W przeciwieństwie do tego \cmdA{abc}\cmdA{abc}wyświetla „abc abc”. Czemu? Dwie instancje \cmdA{abc}każdego wyjścia abc; biała spacja przed abcjest tam, ponieważ pojedynczy znak końca linii po \newcommand\cmdA[1]{jest konwertowany na biały znak . Białe znaki wprowadzone przez pierwszą instancję programu \cmdA{abc}są ignorowane przez TeX, ponieważ, z założenia, występują na początku wiersza; jednak biały znak wniesiony przez drugie wystąpienie \cmdA{abc}nie jest. Tak właśnie kończysz abc abc.
Dodatek , podpowiedziany komentarzem @PhelypeOleinik: Niektórzy czytelnicy mogą odnieść wrażenie, pochłaniając poprzednią dyskusję, że chociaż nieumiejętność zakończenia niektórych wierszy znajdujących się, powiedzmy, w definicji makra, %może być błędem, z pewnością kończy każdy wiersz w tym makrze definicja z %nie boli. Niestety, to też byłby błąd.
Rozważmy następujący, wprawdzie nieco wymyślony przykład. Zawiera 5 instancji %, z których tylko jeden ma znaczenie:
\ifnum1=0%
1%
a%
\else%
b%
\fi
Tutaj \ifnum<u>=<v>jest warunek, który sprawdza, czy <u>i <v>są liczbowo równe. (Jeżeli jedna <u>lub <v>nie jest numeryczny, komunikat o błędzie jest wydawana I właśnie idee fix. 1A 01. Są takie same)
Co by się domyślić (La) TeX wyjście będzie: 1, 1a, a, lub b? Jeśli zgadłeś b- w końcu 1 zdecydowanie nie jest równe 0! - pomyliłbyś się. Prawidłowa odpowiedź brzmi a. Czemu?
Obecność %postaci natychmiast po \ifnum1=0pochłania niewidoczny znak końca linii; w ten sposób TeX kontynuuje skanowanie do przodu, aż napotka pierwszy nienumeryczny znak, aby ustawić test warunkowy. Dlatego warunek, który faktycznie jest oceniany przez TeX, to \ifnum1=01- pamiętaj: białe znaki na początku linii są ignorowane - co jest prawdą . Dlatego azostaje złożony.
Gdyby jednak ktoś też napisał
\ifnum1=0
1%
a%
\else%
b%
\fi
albo jeszcze lepiej
\ifnum1=0
1
a
\else
b
\fi
prawidłowa odpowiedź byłaby taka b, ponieważ TeX „zobaczyłby” znak końca linii po nim \ifnum1=0, przekształciłby go w znak spacji, uświadomił sobie, że powinien rozpocząć ocenę, czy \ifnum1=0jest prawdziwy, i wybrać odpowiednią gałąź warunkowej struktury „drzewa” .