2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Работа с аргументами в макросе
Сообщение24.12.2021, 18:53 
Подскажите пожалуйста, как сравнить строку-аргумент со строкой в макросе

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass[12pt]{article}

\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}

\begin{document}

% Результат: "ed красныйed"
\def\test#1{\if#1red красный\else другое\fi}
\test red

% Результат: "другое"
\def\test#1{\if#1red красный\else другое\fi}
\test{red}

% Результат: "другое"
\def\test#1{\if#1 red красный\else другое\fi}
\test{red}

% Результат: "другое"
\def\test#1{\if{#1}{red} красный\else другое\fi}
\test{red}

\end{document}


И можно ли проверить пустой аргумент?

 
 
 
 Re: Работа с аргументами в макросе
Сообщение24.12.2021, 20:39 
С одной стороны, не очень понятно, что вы хотите. С другой - пакет ifthen и его варианты не помогут?

 
 
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 17:17 
Спасибо за совет, ifthen стоит изучить

Но я хотел бы все же разобраться, как работают эти вещи на голом TeX-е. Хотя бы в каких-то основных моментах, какие используются средства, механизмы, команды чистого TeX. Вот например я хочу создать как в любом нормальном ЯП макрос (функцию), которая принимает аргументы, затем работать с этими аргументами как в теле функции того же языка C, например.

Если конкретно, то я хочу написать макрос без применения сторонних пакетов, который принимает две произвольные строки и сравнивает/разбирает/анализирует их как мне угодно внутри макроса, т е теми средствами, которые описаны в книге Кнута. Но Кнута читать тяжело, приходится раз на 10 прочитать одну и ту же тему (с учетом гугла и форумов).

-- 26.12.2021, 17:31 --

Вопрос, если так можно выразится, системный, общий, касается понимания системы TeX вообще, я ее пытаюсь понимать как полноценный язык программирования с циклами, условиями, переменными и всем таким. Когда хочу реализовать простейшую логику в макросе (разбор аргументов), все оказывается крайне усложнено в TeX.

Ну судите за многословность, сформулировал мысль как мог.

 
 
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 17:52 
MexaZaurus в сообщении #1544331 писал(а):
Но я хотел бы все же разобраться, как работают эти вещи на голом TeX-е.
Тогда немного оффтопичный ответ, но...

Это может быть интересно как развлечение, вроде разгадывания кроссвордов. Но шансы на то, что кто-то что-то по этому поводу подскажет, примерно нулевые - Plain $\TeX$ уже давно практически никто непосредственно не использует. Так что если вам просто интересно, то разбирайтесь, но если вы думаете, что таким способом лучше поймете работу чего-то более высокоуровневого, то, скорее всего, вы ошибаетесь, и на это не стоит тратить время.

 
 
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 18:47 
Спасибо за совет

Просто все обычно ссылаются к TeXBook, и складывается впечатление что нужно знать сначала базу от Кнута

Я пишу конспект по математике в Latex и TikZ, уже много написал. По мере написания я изучал и задействовал все больше возможностей системы, те же макросы, например. Сначала обходился книгами Львовского и Котельникова. Потом возникла потребность в более сложных вещах, пришлось обращаться к базе от Кнута. Но читая Кнута, понимаю, что слишком сложна система, PlainTeX это что-то вроде Ассемблера.

В таком случае вопрос по другому поставлю: есть-ли еще пакеты, которые могут облегчить программирование, в дополнение к ifthen. Вот в инете советуют еще xparse, а также копать куда-то в сторону PGF (пока не разбирался). Меня интересуют циклы, условия, парсинг аргументов, все что есть в обычных ЯП, полнота возможностей.

В общем, я ориентируюсь на TikZ, что у него вообще свой синтаксис, но ведь в основе, если я не ошибаюсь, все тот же голый TeX. Ведь как-то происходит обработка сложных вещей, например взять команду \draw [red,->] (A) -- (12,-5.3); Насколько я понимаю, \draw - обычный TeX-макрос и он как-то разбирает последующую строку, т е задействованы все возможности программирования. Что если я хочу научиться делать такие же макросы.

 
 
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 20:09 
MexaZaurus в сообщении #1544344 писал(а):
Просто все обычно ссылаются к TeXBook, и складывается впечатление что нужно знать сначала базу от Кнута
Это неправильное впечатление.
MexaZaurus в сообщении #1544344 писал(а):
Что если я хочу научиться делать такие же макросы.
Это не так уж сложно, но для этого достаточно освоить синтаксис команды \def (если надо, что само по себе бывает довольно редко).

 
 
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 22:01 
Вот например

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass[12pt]{article}

\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[scale=.1]
 \def\drawline#1{\draw [#1,->] (0,0) -- (20,20);}
 \drawline{red}
 \drawline{blue,shift={(5,-5)}}
 \drawline{}
\end{tikzpicture}

\end{document}


Нужно спрятать часть TikZ-кода в макрос. При этом он должен меняться в зависимости от параметра. В третьем варианте вызова \drawline{} у меня останется запятая в конечном коде: \draw [,->] (0,0) -- (20,20); после пустого аргумента. Как проверить наличие аргумента в макросе и при его отсутствии не печатать запятую. Вместо запятой могут быть более серьезные части кода.

Вот я и полез изучать базу, синтаксис def и от чего и написал первый пост.

 
 
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 22:09 
Посмотрите на пакет xargs, по-видимому, это более простой способ получить желаемое. :-)

 
 
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 22:24 
Pphantom

Интересно, нужно будет изучить, спасибо

Вот поковырял пакет ifthen

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass[12pt]{article}

\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}
\usepackage{ifthen}

\begin{document}

\def\testa#1{\ifthenelse{\equal{#1}{red}}{Красный}{\equal{#1}{yellow}{Желтый}{\equal{#1}{}{Другой}}}}

\def\testa#1{
 \ifthenelse{
  \equal{#1}{red}}{Красный}{
   \equal{#1}{yellow}}{Желтый}{
    \equal{#1}{}}{Пусто}{Другое}}

\def\testa#1{
 \ifthenelse{\equal{#1}{red}}{Красный}{
  \ifthenelse{\equal{#1}{yellow}}{Желтый}{
   \ifthenelse{\equal{#1}{}}{Пусто}{Другое}}}}

\testa{red}
\testa{yellow}
\testa{green}
\testa{}

\end{document}


Робит, надежда еще есть :-)

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group