解析句子并拆分成多个部分

解析句子并拆分成多个部分

我想为我的文档生成如下标题:

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\begin{document}
\noindent \colorbox{red}{\expandafter\MakeUppercase\expandafter{\Huge My example title}} \\[-0.1em]
\noindent \colorbox{red}{\expandafter\MakeUppercase\expandafter{\Huge is very long}} \\[-0.1em]
\end{document}
  • 它可以跨越多行
  • 我想手动决定换行的位置

我想用一个命令输入标题的文本。例如

\myTitle = {My example title \\ goes here}

我可以在其中指定换行符的位置(可以有多个)。

我想要的是将该字符串拆分成单独的行,然后使用 for 循环生成标题。以下是一些不起作用的伪代码:

\documentclass{article}
\usepackage{tikz}

\newtoks\myTitle

% THIS IS PSEUDO-CODE
\newcommand{\printTitle}{%
    \foreach \line in \numberOfLines {%
        \noindent \colorbox{red}{\expandafter\MakeUppercase\expandafter{\Huge \line}} \\[-0.1em]
    }
}
%~~~~~~~~~~~~~~~~~~~~~

\begin{document}

\myTitle = {My example title \\ goes here}
\printTitle

\end{document}

答案1

由于您使用 标记了问题,因此这里有一个使用变量和循环遍历项目的expl3解决方案。标题的每一行都使用 打印,其中行可用作。也替换为,因为它更好 ;-)seq\seq_map_function:NN\TitleLine#1\MakeUppercase\text_uppercase:n

在此处输入图片描述

\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\newtoks\myTitle

\ExplSyntaxOn
\seq_new:N \l__mike_title_seq
\NewDocumentCommand \printTitle { }
  {
    \seq_set_split:NnV \l__mike_title_seq { \\ } \myTitle
    \seq_map_function:NN \l__mike_title_seq
      \TitleLine
  }
\cs_new_eq:NN \TextUppercase \text_uppercase:n
\ExplSyntaxOff

\newcommand\TitleLine[1]{%
  \noindent
  \colorbox{red}{\TextUppercase{\Huge #1}}\par\vspace{-0.1em}}

\begin{document}

\myTitle = {My example title \\ goes here}
\printTitle

\end{document}

答案2

您可能想要更改默认设置,即本质上“什么都不做”:

\documentclass{article}
\usepackage{xparse,xcolor}

\ExplSyntaxOn
\NewDocumentCommand{\settitle}{m}
 {
  \seq_gset_split:Nnn \g_mike_title_seq { \\ } { #1 }
 }
\NewDocumentCommand{\printtitlegeneric}{O{}}
 {
  \mike_title_print:n { #1 }
 }

\seq_new:N \l__mike_title_print_seq
\seq_new:N \g_mike_title_seq
\tl_new:N \l__mike_title_color_tl
\cs_new_eq:NN \__mike_title_font: \scan_stop:
\cs_new_eq:NN \__mike_title_color:nn \use_ii:nn
\cs_new_eq:NN \__mike_title_case:n \use:n

\cs_new_protected:Nn \mike_title_print:n
 {
  \group_begin:
  \keys_set:nn { mike / title } { #1 }
  \seq_set_map:NNn \l__mike_title_print_seq \g_mike_title_seq 
   {
    \hbox:n
     {
      \exp_not:N \__mike_title_font:
      \exp_not:N \__mike_title_color:nn { \l__mike_title_color_tl }
       {
        \exp_not:N \__mike_title_case:n { \exp_not:n { ##1 } }
       }
     }
   }
  \noindent\seq_use:Nn \l__mike_title_print_seq { \\[-\lineskip] }
  \group_end:
 }

\keys_define:nn { mike / title }
 {
  font .code:n = \cs_set_protected:Nn \__mike_title_font: { #1 },
  color .code:n =
    \tl_set:Nn \l__mike_title_color_tl { #1 }
    \cs_set_protected:Nn \__mike_title_color:nn { \colorbox{##1}{##2} },
  uppercase .code:n = \cs_set_eq:NN \__mike_title_case:n \text_uppercase:n,
 }

\ExplSyntaxOff

\begin{document}

\settitle{My example title \\ goes here}

\printtitlegeneric[color=red,font=\Huge,uppercase]

\bigskip

\printtitlegeneric[color=green!70!blue,font=\Large]

\end{document}

在此处输入图片描述

答案3

\documentclass{article}
\usepackage{listofitems,xcolor}
\newcommand\myTitle[1]{%
  \setsepchar{\\}%
  \readlist*\titlelines{#1}%
  \foreachitem\z\in\titlelines[]{%
    \ifnum\zcnt=1\relax\else\\[-0.1em]\fi%
    \noindent\colorbox{red}{\expandafter\uppercase\expandafter{\z}}%
  }%
}
\begin{document}
\myTitle{My example title \\ goes here}
\end{document}

在此处输入图片描述

边框大小可以通过长度 进行调整\fboxsep。但是,如果减小到 的默认值以下,3pt则可能需要\\[-0.1em]将值向负方向增加。

相关内容