使 \par 在命令参数中起作用

使 \par 在命令参数中起作用

我遇到了一个问题,我认为除了变通方法外,无法解决。我想预定义页面,然后稍后将其插入文档中。问题是,这\par(如果在预定义页面中使用)会导致错误。

这是我的 MnWE:

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{blindtext}

\makeatletter

%%%%makes a \page_#1 which expands to #2
\def\setpage#1#2{
\expandafter\def\csname page_#1\endcsname {
\newpage
#2
\clearpage
}
}

%%%%call the pages
\def\callpage#1{
\csname page_#1\endcsname 
}

%%%%define pre-defined pages
\setpage{1}{insert Seite \par
\blindtext
}
\setpage{2}{insert Seite2 % note the implicit \par here

}

\begin{document}

Text

\callpage{1}

\callpage{2}




Wieder Text

\end{document}

我尝试通过以下方式重新定义\par内部\setpage

\def\par{\mbox{} \linebreak \indent}

但这是不可编译的(内存错误)。

我的\setpage命令应生成一个包含参数内容的单独页面#1。参数应采用任何内容,也可以写在\begin{document}和之间\end{document}

答案1

一些评论:

  • 带有段落(标记)的“长”参数\par只能用于宏,宏的定义为\long\long\def\macro。这是 的默认设置\newcommand\setpage需要以这种方式定义。\callpage但是, 不应允许\par标记,因为 中禁止使用标记。它可以用或星号形式\csname来定义。\def\newcommand*

  • 由于\makeatletter处于活动状态,以下示例使用\@namedef\@nameuse将冗长的表达式替换为\csname具有更易于理解的宏名的宏。

  • 例如,如果在命令序列名称之后没有被忽略,行尾通常会被 TeX 转换为空格。在垂直模式下,它们不会造成任何损害,但在水平模式下它们不会被忽略。以下示例通过在需要时注释行尾来避免这种情况。

完整示例:

\documentclass[12pt,a4paper]{article}
\usepackage{blindtext}

\makeatletter

%%%%makes a \page_#1 which expands to #2
\newcommand{\setpage}[2]{%
  \@namedef{page_#1}{%
    \newpage
    #2%
    \clearpage
  }%
}

%%%%call the pages
\newcommand*{\callpage}[1]{%
  \@nameuse{page_#1}%
}

%%%%define pre-defined pages
\setpage{1}{insert Seite \par
  \blindtext
}
\setpage{2}{insert Seite2 % note the implicit \par here

}

\makeatother

\begin{document}

Text

\callpage{1}

\callpage{2}

Wieder Text

\end{document}

答案2

你认为这个\def更短是错误的。也许从字符数上看它更短,但它可以让你免于在出现一些奇怪的错误时抓狂。

假设您加载了一个仅使用部分功能的包,但是\setpage当调用您利用的功能时,该包使用一个名为的宏作为其工作的一部分。

你能看出什么地方出了问题吗?

在这种情况下,使用\newcommand会告诉您该名称已被使用,您只需说“好的,让我更改名称”。

正确的定义如下。

\newcommand\setpage[2]{%
  \expandafter\def\csname glanz@page@#1\endcsname{%
    \newpage
    #2%
    \clearpage
  }%
}

\newcommand\callpage[1]{%
  \csname glanz@page@#1\endcsname
}

使用@比 更安全_(某些包会_激活,您的使用可能会中断)。此外,添加前缀将模拟“命名空间”,从而最大限度地降低重新定义已采用的宏的风险。

请注意%保护行尾。

用 定义的宏\newcommand是自动的\long,因此它们允许\par在其参数中。

相关内容