格式化在自定义环境中使用命令输入的文本

格式化在自定义环境中使用命令输入的文本

我想创建某种待办事项列表。这是一个简单示例:

\documentclass{article}

\newenvironment{myEnv}[1]{%
    \begin{center}%
        --- #1 ---%
    \end{center}
}{}

\newcommand*{\task}[2]{#1 (#2),}

\begin{document}
    \begin{myEnv}{1st week of November}
        \task{cycling}{probably}
        \task{swimming}{once per two days}
    \end{myEnv}
\end{document}

我正在尝试修改myEnv定义以实现两件事:1) 将环境内文本的首字母变为myEnv大写;2) 自动用逗号分隔任务,用句号结束​​整个文本。我想继续以这种方式输入任务,因为它允许轻松更改任务的顺序。那么我应该怎么做呢?这真的可行吗?

目前结果: 在此处输入图片描述

以及所需的一个: 在此处输入图片描述

答案1

在这里我定义标点符号\seppunct并设置它事先的到给定的任务。因此,最初,我将其值设置为无,一旦调用第一个任务,我将其设置为逗号。然后,当环境关闭时,我添加一个句点。

至于初始任务的大写,我有一个宏\MkUC,最初设置为使其参数(任务的第一个字符)大写。第一个任务完成后,我重新定义它,使其不将任务中的第一个字母大写。

\documentclass{article}

\newenvironment{myEnv}[1]{%
    \def\seppunct{}%
    \def\MkUC##1{\uppercase{##1}}
    \begin{center}%
        --- #1 ---%
    \end{center}
}{.}

\newcommand*{\task}[2]{%
  \seppunct{} \MkUC#1 (#2)%
  \def\seppunct{,}%
  \def\MkUC##1{##1}%
  \ignorespaces%
}

\begin{document}
    \begin{myEnv}{1st week of November}
        \task{cycling}{probably}
        \task{swimming}{once per two days}
    \end{myEnv}
\end{document}

在此处输入图片描述

补充

原帖者在评论中询问是否支持将首字母变音符号大写。使用上述代码时,最简单的解决方法是将变音符号放在一组中,如\task{{\"c}ycling}{probably}。但是,由于这可能令人讨厌,因此这里有一个适用于标准变音符号的解决方法,但仍会被诸如首字母 之类的特殊符号所欺骗\ae

\documentclass{article}
\newenvironment{myEnv}[1]{%
    \def\seppunct{}%
    \def\MkUC##1##2{%
      \ifcat A##1\uppercase{##1}\expandafter##2\else\uppercase{##1##2}\fi}
    \begin{center}%
        --- #1 ---%
    \end{center}
}{.}

\newcommand*{\task}[2]{%
  \seppunct{} \MkUC#1 (#2)%
  \def\seppunct{,}%
  \def\MkUC##1{##1}%
  \ignorespaces%
}

\begin{document}
    \begin{myEnv}{1st week of November}
        \task{cycling}{probably}
        \task{swimming}{once per two days}
    \end{myEnv}
    \begin{myEnv}{1st week of November}
        \task{\"cycling}{probably}
        \task{swimming}{once per two days}
    \end{myEnv}    
    \begin{myEnv}{1st week of November}
        \task{c\"ycling}{probably}
        \task{swimming}{once per two days}
    \end{myEnv}    
    \begin{myEnv}{1st week of November}
        \task{\ae gon}{conqueror}
        \task{swimming}{once per two days}
    \end{myEnv}
\end{document}

在此处输入图片描述

答案2

您可以expl3通过以下方式使用xparse

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentEnvironment{todolist}{m}
 {
  \par\addvspace{\topsep}
  {\centering #1\par}
  \nopagebreak\vspace{\medskipamount}
 }
 {
  \noindent\jakbog_todolist:
  \par
  \addvspace{\topsep}
 }

\NewDocumentCommand{\task}{mm}
 {
  \seq_put_right:Nn \l_jakbog_todolist_seq { #1~(#2) }
 }

\seq_new:N \l_jakbog_todolist_seq
\tl_new:N \l_jakbog_todolist_first_tl
\cs_generate_variant:Nn \tl_mixed_case:n { V }

\cs_new_protected:Nn \jakbog_todolist:
 {
  \seq_pop_left:NN \l_jakbog_todolist_seq \l_jakbog_todolist_first_tl
  \tl_mixed_case:V \l_jakbog_todolist_first_tl
  \seq_if_empty:NF \l_jakbog_todolist_seq { ,~ }
  \seq_use:Nn \l_jakbog_todolist_seq { ,~ } .
 }

\ExplSyntaxOff

\begin{document}

\begin{todolist}{1st week of November}
  \task{cycling}{probably}
  \task{swimming}{once per two days}
\end{todolist}

\begin{todolist}{2nd week of November}
  \task{sleeping}{surely}
  \task{watching TV}{four hours per day}
  \task{drinking beer}{three every day}
\end{todolist}

\begin{todolist}{3rd week of November}
  \task{Sleeping}{definitely}
\end{todolist}

\end{document}

其思想是将\task输入存储在一个序列中。在环境的末尾,序列的第一项被拆分并传递\tl_mixed_case:n。如果序列仍然不为空,则添加“逗号空格”;然后使用序列,在项之间使用“逗号空格”,最后使用句点。

在此处输入图片描述

相关内容