如何从环境中设置多种格式(字体类型、文本颜色、字体大小等)?

如何从环境中设置多种格式(字体类型、文本颜色、字体大小等)?

我想定义一个类似样式的环境。也就是说,当将任何段落放入该环境中时,它会应用各种格式。

例如:

  • 我希望文本以某种字体显示
  • 它具有特定的颜色,在环境中定义,如果可能的话,使用我定义颜色的命令
  • 以大尺寸显示
  • 以粗体显示
  • 没有缩进
  • 在下一段中添加一个空格
  • ETC。

我在这里看到了一些答案,并且写了这段代码:

\newenvironment{redtitle}{%
    %\bgroup
    \par
    \fontfamily{ptm}\selectfont \noindent \textcolor{red} \textbf
}
{%
    \par %\egroup
}

这是我尝试应用它的片段:

\begin{redtitle}
    Some nifty code and stuffz
\end{redtitle}

我收到此错误:

!\textbf 的参数有一个额外的 }。\par l.230 \begin{redtitle} 我遇到了刚刚插入的}' that doesn't seem to match anything. For example,\def\a#1{...}' 和\a}' would produce this error. If you simply proceed now, the\par',这将导致我报告失控参数,这可能是问题的根源。但是如果你的}' was spurious, just type2' 它会消失。

参数失控?!段落在 \textbf 完成之前结束。\par l.230 \begin{redtitle} 我怀疑您忘记了一个 `}',导致我将这个控制序列应用于太多文本。我们该如何恢复?我的计划是忘记整件事并希望一切顺利。

那么,我该如何实现这个目标呢?

我是 LaTeX 的新手,因此如果您发现任何不好的做法或者有更好的方法,我将非常感谢您的反馈。

答案1

您犯了几个错误。主要是您混淆了接受参数的宏(例如\textcolor\textbf)和不接受参数的宏(在本例中为开关\color\bfseries)。

\textcolor需要两个参数(好吧,这比这更复杂一点,但我们先回避这个问题):颜色和要设置为该颜色的文本,因此通常你有例如

\textcolor{red}{text which will be printed in red}

当你写作时

\textcolor{red} \textbf

在 TeX 看来,这和你写的差不多

\textcolor{red}{\textbf}

\textbf它本身是一个需要参数的宏,所以事情会变得非常错误(正如您所经历的)。

长话短说:使用开关:\bfseries是一个宏,告诉“从这里开始将文本变为粗体”。您不需要括号:\bfseries{...}是无用的。由于环境总是形成一个组,因此您不需要在环境代码中显式地\bgroup使用 and 。\egroup

\newenvironment{redtitle}{%
    \par
    \fontfamily{ptm}\selectfont
    \noindent
    \color{red}%
    \bfseries
    \ignorespaces
}
{%
 \par
}

答案2

下面是一个您可以自定义的示例。我定义了两个环境。第一个与您的类似;第二个是列表环境,可能更适合您的需求。段落的样式在宏中定义\myenvstyle

\newcommand{\myenvstyle}{%
  \fontfamily{Cochineal-LF}\selectfont\color{mycolor}\Large}

而颜色是通过以下方式定义的\definecolor(这只是使用该包定义新颜色的众多方法之一xcolor):

\definecolor{mycolor}{rgb}{1,0,1}

这是一个最小的工作示例:

\documentclass{article}
\usepackage{lipsum}
\usepackage{xcolor}

\definecolor{mycolor}{rgb}{1,0,1}
\newcommand{\myenvstyle}{%
  \fontfamily{Cochineal-LF}\selectfont\color{mycolor}\Large}

\newenvironment{myenv}
  {\par\vspace{\baselineskip}%
   \myenvstyle\noindent\ignorespaces}
  {\par\vspace{\baselineskip}}

\newenvironment{mylistenv}
  {\list{}{\listparindent 0em%
    \itemindent    \listparindent
    \leftmargin    0pt
    \rightmargin   \leftmargin
    \parsep        0pt}%
  \item\relax\myenvstyle}
  {\endlist}

\begin{document}
  \lipsum[11]
  \begin{myenv}
    \lipsum[7]
  \end{myenv}  
  \lipsum[11]
  \begin{mylistenv}
    \lipsum[7]
  \end{mylistenv}
  \lipsum[11]
\end{document}

答案3

使用 XeTeX 或 LuaLaTeX 的解决方案:

\documentclass{article}

\usepackage{fontspec}
\usepackage{unicode-math}
\usepackage{xcolor}
\usepackage{lipsum}

%text fonts
\setmainfont{STIX Two Text}
\setsansfont{GFS Neohellenic}
%math fonts
\setmathfont{STIX Two Math}
\setmathfont{GFS Neohellenic Math}[version=sansmath]

\newcounter{myenv}
\newenvironment{myenv}[1][]% environment name
{% begin code
  \par\vspace{\baselineskip}\color{blue}%color of body
  \sffamily\mathversion{sansmath}\noindent
  \refstepcounter{myenv}%
  \textcolor{red}{\textbf{My Enviroment \themyenv\ #1}}%color of title
  \par\noindent\ignorespaces% if you want to indent jus delete \noindent
}%
{% end code
  \par\vspace{\baselineskip}%
  \noindent\ignorespacesafterend%
}

\begin{document}
\lipsum[1]
\[
\sum_{i\in I} A_{i}=\prod_{j\in J}B_j
\]
\begin{myenv}
\label{foo}
\lipsum[2]
\[
\sum_{i\in I} A_{i}=\prod_{j\in J}B_j
\]
\end{myenv}
A reference~\ref{foo}
\end{document}

输出: 在此处输入图片描述

相关内容