Makro (neuer Befehl) Warum wird ein bestimmter Text nicht in die Ausgabe aufgenommen?

Makro (neuer Befehl) Warum wird ein bestimmter Text nicht in die Ausgabe aufgenommen?

Ich möchte einige Texte und Tabellen auf derselben Seite wiederholen. Ich versuche den unten angegebenen Code, aber er wird nur einmal gedruckt und dann wird das Lineal am Ende wieder nicht gedruckt. Der vollständige Code ist unten angegeben.

\documentclass{article}
\usepackage{multirow}
\usepackage{caption}
\usepackage{subfig}
\usepackage{makecell}
\usepackage{booktabs}
\usepackage{tikz}
\usepackage{tabu}
\usepackage{array}
\usepackage{graphicx}
\usepackage[showframe]{geometry}
\usepackage{floatrow}
\floatsetup[table]{capposition=top}
\captionsetup{skip=0pt}

\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\usepackage{xparse}% http://ctan.org/pkg/xparse

% Table float box with bottom caption, box width adjusted to content
\newfloatcommand{capbtabbox}{table}[][\FBwidth]

\usepackage{geometry}
 \geometry{
 a4paper,
 total={210mm,297mm},
 left=5mm,
 right=5mm,
 top=2cm,
 bottom=5mm,
 }

\usetikzlibrary{arrows}
\usetikzlibrary{shapes}

\NewDocumentCommand{\myrule}{O{1pt} O{3pt} O{black}}{%
  \par\nobreak % don't break a page here
  \kern\the\prevdepth % don't take into account the depth of the preceding line
  \kern#2 % space before the rule
  {\color{#3}\hrule height #1 width\hsize} % the rule
  \kern#2 % space after the rule
  \nointerlineskip % no additional space after the rule
}

\newcommand\textbox[1]{%
  \parbox{1\textwidth}{#1}%
}

\newcommand\insertBigText[1]{
 \noindent\textbox{\hfil \Large{\textbf{#1}}\hfil} \\

\myrule[1pt][2pt]
\vspace{5pt}
\vspace*{-\baselineskip}

\begin{table}[!htbp]
\parbox{0.45\linewidth}{
  \begin{tabu} spread 0pt {|*{2}{[2pt]X[c,m]|}}
     \hline
     \multicolumn{1}{l}{\textbf{text 1}} & \vspace{5mm}\\ \hline
     \multicolumn{1}{l}{\textbf{text 2}} &  \vspace{5mm} \\\hline 
     \multicolumn{1}{l}{\textbf{text 3 }} &  \vspace{5mm}\\\hline
     \multicolumn{1}{l}{\textbf{text 4}} & some more text\\\hline

    \end{tabu}}
\hfill
\parbox{0.45\linewidth}{
\centering
  \begin{tabu} spread 0pt {|*{1}{[2pt]X[c,m]|}}
     \textbf{string 1} \\\hline 
     \textbf{string 2} \\\hline 
      string 3 \\\hline
    \end{tabu}}
\end{table}

\myrule[1pt][2pt] % strange! doesn't get printed at all
} %end \newcommand\insertBigText[1]{

% ------------ document start
\begin{document}
\captionsetup[table]{skip=0pt}  
\insertBigText{receipt} % only this part gets printed
\vspace{2mm}
\noindent\textbox{\hfil \Large{\textbf{counterfoil}}\hfil} \\ % strange! doesn't get printed at all
\myrule[1pt][2pt] % strange! doesn't get printed at all
\insertBigText{counterfoil} % strange! doesn't get printed at all


\end{document}

Antwort1

Das Hauptproblem besteht hier in der Leitung

\kern\the\prevdepth % don't take into account the depth of the preceding line

in der Definition von \myrule. Um das Problem zu verstehen, schauen Sie sich an, wasDas TeXbook(doppelte gefährliche Biegung unten auf Seite 79) sagt über \prevdepth:

Wird jedoch am Anfang einer vertikalen Liste oder direkt nach einem Regelfeld \prevdepthauf den Sentinel-Wert gesetzt ; dies dient dazu, den nächsten Interline-Kleber zu unterdrücken.−1000pt

\prevdepthWenn Sie Ihren Befehl also zum zweiten Mal verwenden -1000ptund vor dem Setzen des Materials einen vertikalen Sprung von -1000pt(ungefähr -14in!) ausführen, wird das Material offensichtlich nach oben aus der Seite herausgedrückt.

Darüber hinaus gibt es noch weitere Probleme mit dem Code, wie z. B. „using“ \\gefolgt von einer Leerzeile und „using“ \Largeals Befehl mit Argumenten. Ich habe sie behoben (aber je nach Ihrer tatsächlichen Absicht sind möglicherweise noch Anpassungen erforderlich).

Hier ist eine reduzierte Version des Codes

\documentclass{article}
\usepackage{tabu}
\usepackage[showframe]{geometry}

\usepackage{xparse}% http://ctan.org/pkg/xparse

\usepackage{geometry}
\geometry{
 a4paper,
 total={210mm,297mm},
 left=5mm,
 right=5mm,
 top=2cm,
 bottom=5mm,
 }

\NewDocumentCommand{\myrule}{O{1pt} O{3pt} O{black}}{%
  \par\nobreak % don't break a page here%
  \kern#2 % space before the rule
  {\color{#3}\hrule height #1 width\hsize} % the rule
  \kern#2 % space after the rule
  \nointerlineskip % no additional space after the rule
}

\newcommand\textbox[1]{%
  \parbox{1\textwidth}{#1}%
}

\newcommand\insertBigText[1]{
\noindent\textbox{\hfil{\Large\textbf{#1}}\hfil}\par
\myrule[1pt][2pt]
\vspace{5pt}
\vspace*{-\baselineskip}
\begin{table}[!htbp]
\parbox{0.45\linewidth}{%
  \begin{tabu} spread 0pt {|*{2}{[2pt]X[c,m]|}}
     \hline
     \multicolumn{1}{l}{\textbf{text 1}} & \vspace{5mm}\\ \hline
     \multicolumn{1}{l}{\textbf{text 2}} &  \vspace{5mm} \\\hline 
     \multicolumn{1}{l}{\textbf{text 3 }} &  \vspace{5mm}\\\hline
     \multicolumn{1}{l}{\textbf{text 4}} & some more text\\\hline
    \end{tabu}}
\hfill
\parbox{0.45\linewidth}{%
\centering
  \begin{tabu} spread 0pt {|*{1}{[2pt]X[c,m]|}}
     \textbf{string 1} \\\hline 
     \textbf{string 2} \\\hline 
      string 3 \\\hline
    \end{tabu}}
\end{table}
\myrule[1pt][2pt]%
}

\begin{document}

\insertBigText{receipt}
\vspace{2mm}
\myrule[1pt][2pt]
\insertBigText{counterfoil}

\end{document}

Die Ausgabe:

Bildbeschreibung hier eingeben

Sie erhalten weiterhin zwei Warnungen von geometry:

Package geometry Warning: Over-specification in `h'-direction. `width'
(597.50787pt) is ignored.

Package geometry Warning: Over-specification in `v'-direction. `height' 
(845.04684pt) is ignored.

Sie müssen daher die verwendeten Einstellungen überprüfen.

Aktualisieren

AlsegregHinweise inhis commentSie können einen bedingten Test verwenden, um Folgendes sicher \kernin Ihrer Definition zu haben:

\NewDocumentCommand{\myrule}{O{1pt} O{3pt} O{black}}{%
  \par\nobreak % don't break a page here%
  \ifdim\prevdepth>-1000pt\kern\prevdepth\fi
  \kern#2 % space before the rule
  {\color{#3}\hrule height #1 width\hsize} % the rule
  \kern#2 % space after the rule
  \nointerlineskip % no additional space after the rule
}

verwandte Informationen