无支架的新环境

无支架的新环境

该代码运行良好[编辑:谢谢,Mico]

\documentclass{minimal}
\usepackage{tikz}
\usepackage{lipsum}

\newenvironment{MyBox}[1]{%
  \begin{tikzpicture}  
  \node[text width = 0.9\linewidth, text justified] (box) {#1};
  }%
  {\end{tikzpicture}\par \smallskip}

\begin{document}

\begin{MyBox}{%
 \lipsum[1]
}\end{MyBox}%

\end{document}

我想使用这样的命令:

    \begin{MyBox}
    \lipsum[1]
    \end{MyBox}

而不是 :

\begin{MyBox}{%
 \lipsum[1]
}\end{MyBox}%

有没有简单的方法可以做到这一点?

谢谢

答案1

问题是 是#1之后的第一个非空格标记或括号组\begin{MyBox}。如果没有括号,参数就会变成\lipsum,因此您会得到七个段落并被[1]忽略,您可以看到

Missing character: There is no [ in font nullfont!
Missing character: There is no 1 in font nullfont!
Missing character: There is no ] in font nullfont!

在您的日志文件中。

如果环境中有真实文本,情况会更糟:例如,

\begin{MyBox}
Lorem ipsum
\end{MyBox}

只会输入“L”并忽略其余部分。

你有两个选择。最简单的一个是定义一个宏:

\newcommand{\MyBox}[1]{%
  \par\addvspace{\smallskipamount}%
  \begin{tikzpicture}
  \node[text width = 0.9\linewidth, text justified] (box) {\ignorespaces #1\par};
  \end{tikzpicture}%
  \par\addvspace{\smallskipamount}%
}

并将其用作

\MyBox{
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae,
  felis. Curabitur dictum gravida mauris. Nam arcu libero,
  nonummy eget, consectetuer id, vulputate a, magna.
}

或吸收环境的内容以将其传递给。使用参数说明符\node可以轻松实现这一点。使用最新(不早于 2020 年 10 月)的 LaTeX 不需要任何软件包。对于早期版本,请添加。+b\NewDocumentEnvironment\usepackage{xparse}

\documentclass{article}
\usepackage{tikz}
\usepackage{lipsum}

\NewDocumentEnvironment{MyBox}{O{}+b}
 {%
  \par\addvspace{\smallskipamount}%
  \begin{tikzpicture}[#1]
  \node[text width = 0.9\linewidth, text justified] (box) {#2};
  \end{tikzpicture}
  \par\addvspace{\smallskipamount}%
 }{}

\begin{document}

\begin{MyBox}
\lipsum[1]
\end{MyBox}

\end{document}

在这里我添加了一个可选参数,以便您可以将全局选项传递给tikzpicture,比如说

\documentclass{article}
\usepackage{tikz}
\usepackage{lipsum}

\NewDocumentEnvironment{MyBox}{O{}+b}
 {%
  \par\addvspace{\smallskipamount}%
  \begin{tikzpicture}[#1]
  \node[text width = 0.9\linewidth, text justified] (box) {#2};
  \end{tikzpicture}
  \par\addvspace{\smallskipamount}%
 }{}

\begin{document}

\begin{MyBox}[every node/.style={color=blue}]
\lipsum[1]
\end{MyBox}

\end{document}

答案2

该解决方案使用environ允许将环境内容捕获到\BODY宏中的包,然后可以在其他地方使用。

A

    \documentclass[12pt,a4paper]{article}

\usepackage{tikz}
\usepackage{lipsum}

\newenvironment{MyBox}[1]{% Old definition
    \begin{tikzpicture}  
        \node[text width = 0.9\linewidth, text justified] (box) {#1};
    }%
    {\end{tikzpicture}\par \smallskip}


%%**************************************** added <<<<<<<<<<<<<<,
\usepackage{environ} % needed <<<

\NewEnviron{MyBoxALT}[1][]{% new definition <<<<<<<<<<<<<<<<<<<
    \begin{tikzpicture}[#1]  
        \node[text width = 0.9\linewidth, text justified] (box) {\BODY};
    \end{tikzpicture}\par \smallskip%   
}
%%****************************************

\begin{document}
    
    Environment \verb|MyBox|
    
    \begin{MyBox}{%
            1. \lipsum[1]
    }\end{MyBox}%
    
    \bigskip
    
    Environment \verb|MyBoxALT|
    
    \begin{MyBoxALT} % added <<<<<<<<<<<<<<<<<
        2. \lipsum[1]
    \end{MyBoxALT}%

    \begin{MyBoxALT}[every node/.style={color=blue}] % added <<<<<<<<<<<<<<<<<
    3. \lipsum[1]
     \end{MyBoxALT}%
    
    
\end{document}

相关内容