Создать среду перечисления, которую можно отключить

Создать среду перечисления, которую можно отключить

Этот вопрос привел к новому пакету:
comment_io

Я хотел бы создать документ, используя перечисленные среды, которые я затем мог бы включать и выключать перед компиляцией.

Например, предположим, что у меня есть раздел, который выглядит следующим образом:

\begin{enumerate}
    \item This is a test.
    \item This is another test.
    \item This is yet another test.
\end{enumerate}

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

1. This is a test.
2. This is another test.
3. This is yet another test.

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

This is a test. This is another test. This is yet another test.

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

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

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

решение1

Чтобы разрешить вложенным enumerate(или другим спискам) средам функционировать, вам нужно захватить, \itemесли вы собираетесь сделать это пустым оператором внутри этого нового on-off enumerate. Для этого мы сохраняем его определение в преамбуле и восстанавливаем его для использования в начале каждого enuemrateusingetoolbox's \AtBeginEnvironment. Если вы планируете вкладывать и другие списки, вам необходимо выполнить восстановление \itemаналогичным образом.

Ниже я определил, enumerate*какой из них отключается во время компиляции, но при этом по-прежнему поддерживает вложенные enumerates:

введите описание изображения здесь

\documentclass{article}
\usepackage{etoolbox}
\AtBeginEnvironment{enumerate}{\let\item\olditem}
\let\olditem\item
\newenvironment{enumerate*}
  {\par\let\item\relax}
  {\par}
\begin{document}

\begin{enumerate*}
  \item Something
    \begin{enumerate}
      \item Something else
      \item Another thing
        \begin{enumerate*}
          \item This is it
          \item This is another it
        \end{enumerate*}
    \end{enumerate}
  \item Last thing
\end{enumerate*}

\end{document}

enumerate*переопределено \item, чтобы ничего не делать (be \relax). Таким образом, он полностью проигнорирует любой необязательный аргумент, если таковой имеется. То есть, \item[<stuff>]по умолчанию будет [<stuff>]. Это можно настроить, чтобы поглотить необязательный аргумент, если это необходимо.

Также можно настроить вертикальную настройку, вставленную с помощью enumerate*.

решение2

Спасибо за все ваши ответы. Однако, в конце концов, после того, как я вырвал себе все волосы, пытаясь заставить работать все эти разные методы, я просто решил написать свой собственный скрипт на Python, который комментирует (и раскомментирует) строки в зависимости от определенных команд, включенных в файл.

Так, например, если мой исходный файл выглядит так:

\begin{document}
    \begin{enumerate}
        \item 
        This is a test.
        \item 
        This is another test.
        \item 
        This is yet another test.
    \end{enumerate}
\end{document} 

и я хочу иметь возможность отключить все эти перечисления, я просто добавляю небольшую команду в конец каждой строки, которую я хотел бы закомментировать, например так:

\begin{document}
    \begin{enumerate} %@
        \item %@
        This is a test.
        \item %@
        This is another test.
        \item %@
        This is yet another test.
    \end{enumerate} %@
\end{document}

и позвольте моему скрипту сделать свое дело, превратив файл в нечто похожее на это:

\begin{document}
%@    \begin{enumerate}
%@      \item
        This is a test.
%@      \item
        This is another test.
%@      \item
        This is yet another test.
%@  \end{enumerate}
\end{document}

Это может показаться обременительным, но для меня это абсолютно лучшее решение, поскольку я знаю все, что происходит.

Если кто-то хочет использовать или взглянуть на программу, написанную на Python, ее можно найти наКТАН.

решение3

Определите новую среду в enumitemсоответствии с вашими потребностями:

\documentclass{article}
\usepackage{enumitem}

\newlist{myenum}{enumerate*}{3}
\setlist[myenum]{leftmargin=!,label=\arabic*.}

\begin{document}
\begin{myenum}
\item This is a test.
\item This is another test.
\item This is yet another test.
  \begin{myenum}[label=]
  \item Second level This is a test.
  \item This is another test.
  \item This is yet another test.
    \begin{myenum}[label=\roman*.]
    \item Third level This is a test.
    \item This is another test.
    \item This is yet another test.
    \end{myenum}
  \end{myenum}
\end{myenum}
\end{document}

решение4

Это почти делает работу в вашем варианте использования. Это может быть ненадежно с более причудливыми средами перечисления или опциями - это не справляется с вложенностью так, как вам хотелось бы.

введите описание изображения здесь

\documentclass{article}

\usepackage{etoolbox}
\newtoggle{killenumerate}

\toggletrue{killenumerate}

\newenvironment{myenumerate}
{\iftoggle{killenumerate}
  {\renewcommand{\item}{}}
  {\begin{enumerate}}
}
{\iftoggle{killenumerate}
  {}
  {\end{enumerate}}
}

\begin{document}

Enumeration switched off selectively in preamble.

\begin{myenumerate}
\item One item in myenumerate environment
\item Two
\item Three
\end{myenumerate}

\begin{enumerate}
\item One item in ordinary enumerate
\item Two
\item Three
\end{enumerate}

Enumeration switched on for the rest of the document.

\togglefalse{killenumerate}

\begin{myenumerate}
\item One item in myenumerate environment
\item 
\item Two
\item Three
\end{myenumerate}

\end{document}

Связанный контент