在 XeLaTeX 中使用包背景和“嵌套”tikzpictures 进行相对于页面的定位,尺寸太大

在 XeLaTeX 中使用包背景和“嵌套”tikzpictures 进行相对于页面的定位,尺寸太大

语境

对于个人项目,我希望tikzpicture在每一页上都有一个,它与文本和其中的所有内容相接。我先从 LuaLaTeX 开始,只想添加几个中文字符,然后测试\usepackage[UTF8]{ctex}。我注意到它不必要地改变了文档其余部分的间距。然后我测试了 XeLatex 作为编译器和相应的xeCJK包,它们似乎做了我想要的事情。然而,我注意到,相对于我在使用该background包时创建的页面的相对定位以及其上的附加tikzpicture位置不正确。我使用了以下帖子中的代码在 TikZ 中相对于页面的定位并通过“romain.bqt4”回答,这样页面左上角的坐标为 (0, 0),右下角的坐标为 (1, 1)。然后我在 Google 上搜索了这个问题,似乎是 XeLaTeX 引擎与overlay中的选项配合得不太好\begin{tikzpicture}。我还发现嵌套的 tikzenvironments 不是“可行的方法”,因此我试图正确地实现它。我想我已经解决了大部分问题,但后来在每个\newpage命令中都遇到了“尺寸太大”。一个非常不一致的错误,因为当我尝试为 MWE 提供代码时,重新编译代码并不会一直出现错误。似乎使用命令以\input某种方式导致了这个问题,因为我现在正在尝试。请参阅 (希望是) MWE 的代码。

代码

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usepackage{background}
\usepackage[T1]{fontenc}
\usepackage{xeCJK}
\setCJKmainfont{NotoSansSC-Bold.otf}
\usepackage{lipsum}
\usepackage[textwidth=24cm, centering, margin=2cm, showframe]{geometry}
\usetikzlibrary{shapes.misc, positioning, calc}

\SetBgAngle{0}
\SetBgScale{1}
\SetBgOpacity{1}
\SetBgContents{
\begin{tikzpicture}[remember picture,shift=(current page.north west)] % for XeLaTeX
\begin{scope}[x={(current page.north east)},y={(current page.south west)}]
\node (logo) at (0.5, 0.95) {\pic};
\draw[rounded corners=10pt, line width = 2pt] (logo) -| (0.05, 0.025) -- (0.95, 0.025) |- (logo);
\end{scope}
\end{tikzpicture}
}

\newcommand*{\pic}{\includegraphics[height = 2cm]{example-image.pdf}}

\pagestyle{empty}
\begin{document}

% The 'nested' tikzpicture
\input{mwe} % The following lines are in mwe.tex
% \begin{tikzpicture}[remember picture,overlay,shift=(current page.north west)]
% \begin{scope}[x={(current page.north east)},y={(current page.south west)}]

% \node at (1/2, 1/2) {你好};

% \node at (1/5, 1/5) {\pic};
% \node at (2/5, 1/5) {\pic};
% \node at (3/5, 1/5) {\pic};
% \node at (4/5, 1/5) {\pic};

% \node at (1/5, 2/5) {\pic};
% \node at (2/5, 2/5) {\pic};
% \node at (3/5, 2/5) {\pic};
% \node at (4/5, 2/5) {\pic};

% \node at (1/5, 3/5) {\pic};
% \node at (2/5, 3/5) {\pic};
% \node at (3/5, 3/5) {\pic};
% \node at (4/5, 3/5) {\pic};


% \draw[dashed, line width = 2pt] (0.05, 0.785) -- (0.95, 0.785);
% \node at ({1/3}, 0.855) {\pic};
% \node at ({2/3}, 0.855) {\pic};

% \end{scope}
% \end{tikzpicture}
\newpage
\lipsum[1]
\newpage
\lipsum[2]
\end{document}

输出

这是我想要的输出并且它似乎有效。 我想要的输出 错误

问题

是什么导致了这些尺寸错误,为什么我在使用 LuaLaTeX 时没有看到它们?

答案1

有几件事我要提一下:

  1. \usepackage[utf8]{inputenc}不再需要,因为自 2018 年 4 月起,utf8 编码是默认设置(请参阅https://tug.org/TUGboat/tb39-1/tb121ltnews28.pdf

  2. 如果你使用XeCJK包和 XeLaTeX 编译器,包fontspec会自动加载。并且\usepackage[T1]{fontenc}也不需要。你应该使用包提供的\setmainfont{}命令\setsansfont{}和来设置你的英文字体。与设置中文字体类似,例如\setmonofont{}fontspec\setCJKmainfont{NotoSansSC-Bold.otf}

  3. 课程的默认纸张大小article是信纸(11 英寸高 x 8.5 英寸宽),如果转换为cm信纸,则约为 27.94 厘米 x 21.59 厘米。因此您无法将其设置textwidth=24cmmargin=2cm页面布局。文本宽度将大于总纸张宽度,LaTeX 会忽略它。我认为当您这样做时,您会收到来自 LaTeX 的警告信息。

  4. 正如前面的评论中提到的,background不需要包,因为 latex 钩子系统可以通过使用 来基本完成相同的操作\AddToHook{shipout/background}{...any latex code...}。并且要小心命名新命令,以确保它未被 latex 或其他包定义。所以\pic需要更改为其他内容。

我根据这些要点修改了代码。它应该看起来像你想要的那样。如果我的任何陈述不正确或不准确,请纠正我。以下是代码:

\documentclass{article}
\usepackage{tikz}
\usepackage{xeCJK}
\setCJKmainfont{NotoSansSC-Bold.otf}
\usepackage{lipsum}
\usepackage[centering,margin=2cm,showframe]{geometry}
\usetikzlibrary{shapes.misc, positioning, calc}

\AddToHook{shipout/background}{
\begin{tikzpicture}[remember picture,overlay] 
\node at (current page.north west) {
\begin{tikzpicture}[remember picture,overlay]
\node (logo) at (0.5\paperwidth, -0.95\paperheight) [anchor=center,inner sep=0pt] {\addpicture};
\draw[draw=red!45,anchor=north west,rounded corners=10pt, line width = 2pt] (logo) -| (0.05\paperwidth, -0.025\paperheight) -- (0.95\paperwidth, -0.025\paperheight) |- (logo);
\end{tikzpicture}
};
\end{tikzpicture}
}

\newcommand*{\addpicture}{\includegraphics[height = 2cm]{example-image.pdf}}

\pagestyle{empty}
\begin{document}

% The 'nested' tikzpicture
\input{mwe} % The following lines are in mwe.tex

\newpage
\lipsum[1]
\newpage
\lipsum[2]
\end{document}
% mwe.tex
\begin{tikzpicture}[remember picture,overlay,shift=(current page.north west)]
\begin{scope}[x={(current page.north east)},y={(current page.south west)}]
\node at (1/2, 1/2) {你好};
\node at (1/5, 1/5) {\addpicture};
\node at (2/5, 1/5) {\addpicture};
\node at (3/5, 1/5) {\addpicture};
\node at (4/5, 1/5) {\addpicture};
\node at (1/5, 2/5) {\addpicture};
\node at (2/5, 2/5) {\addpicture};
\node at (3/5, 2/5) {\addpicture};
\node at (4/5, 2/5) {\addpicture};
\node at (1/5, 3/5) {\addpicture};
\node at (2/5, 3/5) {\addpicture};
\node at (3/5, 3/5) {\addpicture};
\node at (4/5, 3/5) {\addpicture};
\draw[dashed, line width = 2pt] (0.05, 0.785) -- (0.95, 0.785);
\node at ({1/3}, 0.855) {\addpicture};
\node at ({2/3}, 0.855) {\addpicture};
\end{scope}
\end{tikzpicture}

相关内容