(La) TeX - Что делает символ "%"?
у %персонажа, кажется, много применений. До сих пор я встречал это в следующих местах:
- Для написания комментариев
% Schrodinger wave equation
$$\nabla^2\psi + \frac{8\pi^2m}{h^2}(E-V) = 0$$
- (Здесь я могу ошибаться) Для разделения команд на несколько строк (ссылка здесь )
\newcounter{bull}
\newcommand{\showbullcntr}[1]{%
\setcounter{bull}{#1}%
\bullcntr{bull}%
}
- В сочетании с
minipage, чтобы удалить вставленный начальный пробел (адаптировано из этого вопроса)
\noindent
\begin{minipage}{0.5\linewidth}
...
\end{minipage}%
\begin{minipage}{0.5\linewidth}
...
\end{minipage}
Не мог бы кто-нибудь подробно объяснить различные использования %символа в LaTeX? В частности, почему он используется после первого экземпляра \end{minipage}?
Ответы
Три варианта использования указанного %вами персонажа можно объединить в один всеобъемлющий вариант использования: исключить все, что находится в оставшейся части текущей строки ввода, из дальнейшей обработки .
Это все , что включает в себя не только комментарии (первое использование регистра вы упомянули) , но и невидимый конец-строки символов в конце строки ввода. Фактически, после встречи с %символом TeX также проигнорирует любые пробелы, которые могут присутствовать в начале следующей строки. Фактически, пробелы в начале строки ввода всегда игнорируются, независимо от того, была ли завершена предыдущая строка символом %. Ну, дословный режим - исключение, но это тема для другого разговора.
Таким образом,
Hello %
World
и
Hello %
World
в конечном итоге обрабатываются одинаково: TeX читает Hello из первой строки (с пробелом после «Hello») и Worldиз второй строки и выводит «Hello World». Обратите внимание, что символ конца строки в конце первой строки и четыре символа пробела в начале второй строки были отброшены.
Что бы произошло, если бы вход был
Hello%
World
Теперь на выходе будет «HelloWorld». Почему? Ну, как и прежде, символ конца строки в конце первой строки и четыре символа пробела в начале второй строки отбрасываются, и остается только «Hello» из первой строки и «World». со второго.
Еще одна информация: один символ конца строки преобразуется во время первой фазы обработки TeX в пробел. (Напротив, два или более последовательных символа конца строки преобразуются в \parтокен.) Таким образом,
Hello
World
и
Hello World
создать такой же результат.
Обладая этой информацией, мы можем выяснить, каково назначение %символа в следующем фрагменте кода:
\noindent
\begin{minipage}{0.5\textwidth}
...
\end{minipage}%
\begin{minipage}{0.5\textwidth}
...
\end{minipage}
Общая ширина этой конструкции составляет 0.5\textwidth+0.5\textwidth=1\textwidth. Если бы %символ был опущен, символ конца строки после первого экземпляра \end{minipage}был бы преобразован в пробел, а общая ширина была бы 1\textwidth плюс ширина символа пробела . Это почти наверняка не то, что нужно. Также обратите внимание на то, что важно было разместить %символ сразу после \end{minipage}; письмо \end{minipage} %не послужит намеченной цели.
Затем рассмотрим следующие два определения макроса:
\newcommand\cmdA[1]{
#1}
\newcommand\cmdB[1]{%
#1}
Оба определения допустимы. В частности, с чисто синтаксической точки зрения не обязательно указывать %символ после \newcommand\cmdA[1]{, чтобы заставить макрос скомпилировать. Но это не означает, что два макроса производят одинаковый результат. Угадаете, что \cmdA{abc}\cmdA{abc}и \cmdB{abc}\cmdB{abc}выйдет? Для простоты предположим, что обе последовательности команд находятся в начале строки ввода.
Конечно, \cmdB{abc}\cmdB{abc}выводит «abcabc» без пробелов между подстроками «abc».
Напротив, \cmdA{abc}\cmdA{abc}выводит «abc abc». Почему? Два экземпляра \cmdA{abc}каждого вывода abc; пробел перед abcприсутствует, потому что единственный символ конца строки после \newcommand\cmdA[1]{преобразуется в пробел. Пробел, внесенный первым экземпляром, \cmdA{abc}игнорируется TeX, поскольку он, по предположению, находится в начале строки; однако пробелы, внесенные вторым экземпляром, \cmdA{abc}не являются. Вот как у вас получается abc abc.
Добавление , вызванное комментарием @PhelypeOleinik: некоторые читатели могут создать впечатление, усвоив предыдущее обсуждение, что, хотя неспособность завершить некоторые строки, расположенные, скажем, в определении макроса, %может быть ошибкой, безусловно, завершение каждой строки в этом макросе определение с %не может повредить. К сожалению, это тоже будет ошибкой.
Рассмотрим следующий, по общему признанию, несколько надуманный пример. В нем 5 экземпляров %, только один из которых имеет значение:
\ifnum1=0%
1%
a%
\else%
b%
\fi
Здесь \ifnum<u>=<v>- условие, которое проверяет, равны ли <u>и <v>численно. (Если любое из <u>или не <v>является числовым, выдается сообщение об ошибке. И, просто для исправления идей: 1и 01численно равны.)
Что бы вы сказали (La) TeX будет выводить: 1, 1a, a, или b? Если вы догадались b- ведь 1 точно не равно 0! - Вы бы неправильно догадались. Правильный ответ a. Почему?
Присутствие %персонажа сразу после \ifnum1=0съедает невидимый символ конца строки; таким образом, TeX продолжает сканирование до тех пор, пока не встретит первый нечисловой символ, чтобы установить условную проверку. Следовательно, условие, которое фактически оценивается TeX, \ifnum1=01- помните: пробелы в начале строки игнорируются - что верно . Поэтому и aнабирается.
Но если бы кто-то написал либо
\ifnum1=0
1%
a%
\else%
b%
\fi
или, еще лучше,
\ifnum1=0
1
a
\else
b
\fi
правильный ответ будет b, поскольку TeX "увидит" символ конца строки после \ifnum1=0, преобразует его в символ пробела, поймет, что он должен начать оценку, \ifnum1=0истинно ли , и выберет соответствующую ветвь условной "древовидной" структуры .