Выберите только некоторые элементы из списка в LaTeX - PullRequest
8 голосов
/ 05 марта 2010

У меня есть документ LaTeX, который в основном представляет собой одну большую enumerate среду с несколькими сотнями элементов. Я хочу, чтобы можно было выдать команду типа

\printitems{2,5,12,45-48}

, который будет выводить только запрошенные элементы.

Подобная команда \onlyslides является частью slides.cls, но я не могу понять, что там происходит, и приспособить ее к моим потребностям.

Я могу заменить список item списком сред, например

\begin{myitem}
...
\end{myitem}

\begin{myitem}
...
\end{myitem}

с \newcounter и т. Д., Если это поможет достичь моей цели & mdash; возможность печатать только некоторые элементы с заданными номерами без вырезания и вставки. Я могу хранить элементы в одном файле и команду \printitems в другом, если это необходимо.

Я не могу поместить цифры в файл & mdash; файл постоянно меняется, и мне нужно автоматическое перечисление.

Ответы [ 3 ]

3 голосов
/ 10 марта 2010

Хорошо, тогда поехали.

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

С этого момента вы можете скопировать и вставить его в пустой документ .tex ион должен просто работать:


%% Прежде всего, я использую пакет expl3 для выполнения большей части этого кодирования.Упрощает некоторые вещи.

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn

%% Вот функция для циклического ввода значений в диапазоне запятых, например -2,4-6,8,10-:

\prg_new_conditional:Nnn \i_in_range:nn {TF,T,F} {
  \bool_set_false:N \l_tmpa_bool
  \clist_map_inline:nn {#2} {
    \parse_range:w ##1 - \q_marker - \q_nil #1 \q_nil
  }
  \bool_if:NTF \l_tmpa_bool \prg_return_true: \prg_return_false:
}

%%.входной аргумент содержится в диапазоне:

\cs_set:Npn \parse_range:w #1 - #2 - #3 \q_nil #4 \q_nil {
  \tl_if_eq:nnTF {\q_marker}{#2}{
    \intexpr_compare:nT {#4=#1} {\bool_set_true:N \l_tmpa_bool}
  }{
    \tl_if_empty:nTF {#2}{
      \intexpr_compare:nT {#4>=#1} {\bool_set_true:N \l_tmpa_bool}
    }{
      \tl_if_empty:nTF {#1}{
        \intexpr_compare:nT {#4<=#2} {\bool_set_true:N \l_tmpa_bool}
      }{
        \intexpr_compare:nT {#4>=#1} {
          \intexpr_compare:nT {#4<=#2}
            {\bool_set_true:N \l_tmpa_bool}
        }
      }
    }
  }
}
\cs_generate_variant:Nn \i_in_range:nnTF {nV}

%% Это команда для ввода каждого элемента вашего списка:

\newcommand\numitem[1]{
  \i_in_range:nVTF {\value{enumi}+1}{\l_item_range_tl}{
    \item #1
  }{
    \stepcounter{enumi}
  }
}

%% И перечисляемая среда с диапазономаргумент:

\newenvironment{someitems}[1]{
  \tl_set:Nn \l_item_range_tl {#1}
  \begin{enumerate}
}{
  \end{enumerate}
}
\ExplSyntaxOff

%% Наконец, пример:

\begin{document}
\begin{someitems}{-2,4-6,8,10-}
\numitem{one}\numitem{two}\numitem{three}
\numitem{four}\numitem{five}\numitem{six}
\numitem{seven}\numitem{eight}\numitem{nine}
\numitem{ten}\numitem{eleven}
\end{someitems}
\end{document}
1 голос
/ 09 марта 2010

Сначала используйте функцию foreach, чтобы разделить список через запятую, указанный в

Разделить запятыми параметры в LaTeX

Вы можете упростить его, удалив используемый константный параметр # 2.

Затем определите ваши элементы следующим образом (это способ построить хэш в TeX):

\@namedef{item_1}{This is item 1}
\@namedef{item_2}{This is item 2}
\@namedef{item_3}{This is item 3}

Определите функцию, которая будет использоваться в foreach:

\def\printSingleItem#1{%
    \@ifundefined{item_#1}{%
         \PackageWarning{MyPackage}{Undefined Item #1}%
    }{%
         \@nameuse{item_#1}% This can be more fancy here, using formatting etc.
    }%
}

Последнее определение printitems

\def\printitems#1{\foreach{\printSingleItem}{#1}}
1 голос
/ 07 марта 2010

Сложной (или, скорее, нетривиальной) частью этого является анализ ввода через запятую.Несколько пакетов реализовали это;возможно, реализация lipsum достаточно проста для извлечения для ваших целей.

После этого достаточно просто нажимать на счетчик каждый раз, когда вы нажимаете на элемент, и отображать его содержимое или нет, в зависимости от того, как запятый списокразобранный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...