![Динамическая таблица: установка номера столбца после таблицы](https://rvso.com/image/420037/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0%3A%20%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B.png)
Я хотел бы создать динамическую таблицу со \N
столбцами в начале страницы, в которой \N
будет указано количество разделов во всем документе, поэтому значение \N
устанавливаетсяпослетаблица. Когда я устанавливаю значение \N
перед таблицей (в моем примере, перемещая строку 26 \N=\value{section}
после строки 10 \section{section 1}
), все в порядке, но когда я устанавливаю значение \N
после таблицы (как здесь в моем примере), это генерирует ошибку.
Вот мой код, со значением \N
set после таблицы. Думаю, это не так уж и сложно, но я не смог найти решение. Есть у кого-нибудь идея?
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{graphicx}
\newtoks\cols
\newcounter{i}
\newcount\N
\begin{document}
\section{section 1}
\cols={}
\setcounter{i}{1}
\loop
\cols=\expandafter{\the\expandafter\cols\the\value{i}}
\ifnum\value{i}<\N
\cols=\expandafter{\the\cols &}
\stepcounter{i}
\repeat
\begin{tabular}{|*{\N}{c|}}
\the\cols
\end{tabular}
\section{section 2}
\section{section 3}
\section{section 4}
\section{section 5}
\N=\value{section}
\end{document}
решение1
Обычно такие проблемы можно решить, сохранив таблицу ввнешний файлк концу вашего документа. Все, что вам нужно сделать, это перейти к \input
внешнему файлу в более ранней части документа. Однако для этого требуется дважды скомпилировать документ, чтобы таблица обновилась правильно. Вот пример:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{graphicx}
\usepackage{expl3}
\begin{document}
\section{section 1}
% load the table, if it exists
\InputIfFileExists{\jobname.table}{}{}
\section{section 2}
\section{section 3}
\section{section 4}
\section{section 5}
\ExplSyntaxOn
% open external file for writing
\iow_open:Nn \g_tmpa_iow {\jobname.table}
% get number of sections
\int_set:Nn \l_tmpa_int {\value{section}}
% write begin environment
\iow_now:Nx \g_tmpa_iow {\c_backslash_str begin{tabular}
{|*{\int_use:N \l_tmpa_int}{c|}}}
% write columns into a sequence
\seq_clear:N \l_tmpa_seq
% loop over integers and fill the sequence
\int_step_inline:nn {\l_tmpa_int} {
\seq_put_right:Nn \l_tmpa_seq {#1}
}
% write table content
\iow_now:Nx \g_tmpa_iow {
\seq_use:Nn \l_tmpa_seq {~&~} % join the sequence with " & "
}
% write end environment
\iow_now:Nx \g_tmpa_iow {\c_backslash_str end{tabular}}
\iow_close:N \g_tmpa_iow
\ExplSyntaxOff
\end{document}
Я больше знаком с LaTeX3. Я уверен, что вы можете использовать код LaTeX2e для достижения той же цели.
Обновление: сохранение количества разделов в переменной
Если все, что вам нужно, это сохранить количество секций в переменной, вот более простой пример. Он записывает строку \global\def\numsection{5}
в aux
файл, к которому можно получить доступ при следующем запуске.
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{graphicx}
\begin{document}
Number of sections: \numsection
\section{section 1}
\section{section 2}
\section{section 3}
\section{section 4}
\section{section 5}
\makeatletter
\immediate\write\@auxout{\string\global\string\def\string\numsection{\the\value{section}}}
\makeatother
\end{document}