(La) TeX - Co robi znak „%”?

Oct 13 2020

%charakter wydaje się mieć wiele zastosowań. Do tej pory spotkałem się z tym w następujących miejscach:

  1. Do pisania komentarzy
% Schrodinger wave equation
$$\nabla^2\psi + \frac{8\pi^2m}{h^2}(E-V) = 0$$
  1. (Mogę się tutaj mylić) Do dzielenia poleceń na wiele linii (odniesienie tutaj )
\newcounter{bull}
\newcommand{\showbullcntr}[1]{%
\setcounter{bull}{#1}%
\bullcntr{bull}%
}
  1. 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

92 Mico Oct 13 2020 at 07:14

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” .