LINUX.ORG.RU

[latex] Форма существительного при числительном

 


0

1

Хочется автоматизировать простановку формы слова при счётчике, например: 1 рисунок, 2 рисунка, 5 рисунков, 13 рисунков и т.п.

Есть ли такой макрос или пакет, который позволяет сделать подобное?

Конечно, алгоритм не очень сложный, но не знаю как его реализовать :(

★★★★★

алгоритм очень сложный. Нужно учесть род слова, т.к. числительные отличаются в зависимости от рода. А как это реализовать (без словаря) я не знаю. Кроме того, окончание зависит от слов
2 рисункА но 2 пользователЯ
1 рисуноК но 1 пользоватеЛЬ
для одного слова можно сделать конечно... Но только для одного.

drBatty ★★
()
Ответ на: комментарий от drBatty

Да мне бы хватило и макроса типа \formbycounter{\totvalue{somecounter}}{рисунок}{рисунка}{рисунков}, \formbycounter{\totvalue{somecounter}}{книга}{книги}{книг}, где #4 — для случая когда предпоследняя цифра 1, или последняя цифра 0, 5, 6, 7, 8, 9; #2 — когда последняя цифра 1, #3 — когда последняя цифра 2, 3, 4.

Только вот я не знаю как извлечь предпоследнюю и последнюю цифры числа.

static_lab ★★★★★
() автор топика
Ответ на: комментарий от static_lab

В общем, получилось что-то вроде этого (используется totcount):

\def\formbytotal#1#2#3#4#5{%
    \newcount\@c
    \@c\totvalue{#1}\relax
    \newcount\@last
    \newcount\@pnul
    \@last\@c\relax
    \divide\@last 10
    \@pnul\@last\relax
    \divide\@pnul 10
    \multiply\@pnul-10
    \advance\@pnul\@last
    \multiply\@last-10
    \advance\@last\@c
    \total{#1}~#2%
    \ifnum\@pnul=1#5\else%
        \ifcase\@last#5\or#3\or#4\or#4\or#4\else#5\fi
    \fi
}

Используется следующим образом:

работа изложена на~\formbytotal{page}{страниц}{е}{ах}{ах}, содержит \formbytotal{table}{таблиц}{у}{ы}{}, \formbytotal{figure}{рисун}{ок}{а}{ков}

Заодно немного разобрался в TeXовском программировании :)

static_lab ★★★★★
() автор топика

Подобное (не совсем, но похоже) есть для английского (engord из oberdiek) и немецкого (zahl2string из sauerj) языков.

Evgueni ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.