2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Работа с аргументами в макросе
Сообщение24.12.2021, 18:53 


26/11/21
13
Подскажите пожалуйста, как сравнить строку-аргумент со строкой в макросе

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник


09/05/12
25179
С одной стороны, не очень понятно, что вы хотите. С другой - пакет ifthen и его варианты не помогут?

 Профиль  
                  
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 17:17 


26/11/21
13
Спасибо за совет, ifthen стоит изучить

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

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

-- 26.12.2021, 17:31 --

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

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

 Профиль  
                  
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 17:52 
Заслуженный участник


09/05/12
25179
MexaZaurus в сообщении #1544331 писал(а):
Но я хотел бы все же разобраться, как работают эти вещи на голом TeX-е.
Тогда немного оффтопичный ответ, но...

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

 Профиль  
                  
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 18:47 


26/11/21
13
Спасибо за совет

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

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

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

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

 Профиль  
                  
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 20:09 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Работа с аргументами в макросе
Сообщение26.12.2021, 22:01 


26/11/21
13
Вот например

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник


09/05/12
25179
Посмотрите на пакет xargs, по-видимому, это более простой способ получить желаемое. :-)

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


26/11/21
13
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group