Как растянуть поле строки и не допустить разрыва строки последним элементом?

Как растянуть поле строки и не допустить разрыва строки последним элементом?

Редактирование 1: Изображение должно быть «Три линии вместо четырех».

Редактирование 2: обновлен компилируемый код.

Я новичок в Latex, и у меня есть следующий фрагмент кода шаблона, который представляет собой название моей диссертации:


\documentclass[headsepline,footsepline,footinclude=false,oneside,fontsize=11pt,paper=a4,listof=totoc,bibliography=totoc]{scrbook} % one-sided
\usepackage{graphicx}
\usepackage[ngerman,american]{babel}
\newcommand*{\getUniversity}{University of Earth}
\newcommand*{\getFaculty}{Engineering Department}
\newcommand*{\getDegree}{Computer Science}
\newcommand*{\getSchool}{School of Public Science}
\newcommand*{\getTitle}{This is a Long title that I want to stretch the Margin so that instead of 4 lines, it should only be 3 lines, and the logo at the end won't break}
\newcommand*{\getTitleGer}{This is a Long title that I want to stretch the Margin so that instead of 4 lines, it should only be 3 lines, and the logo at the end won't break}
\newcommand*{\getAuthor}{Author}
\newcommand*{\getDoctype}{Thesis}
\newcommand*{\getSupervisor}{Faculty Professor}
\newcommand*{\getAdvisor}{Faculty Advisr}
\newcommand*{\getSubmissionDate}{\today}
\newcommand*{\getSubmissionLocation}{Somewhere In between}

\begin{document}

\begin{titlepage}
  \centering

    \includegraphics[height=20mm]{example-image-a}
  

  \vspace{5mm}
  {\huge\MakeUppercase{School of \getSchool{} --- \getFaculty{}} \par}

  \vspace{5mm}
  {\large\MakeUppercase{\getUniversity{}} \par}

  \vspace{20mm}
  % \vspace{6mm}
  {\Large \getDoctype{} in \getDegree{} \par}

  \vspace{15mm}
  % \vspace{4mm}
  {\huge\bfseries \getTitle{} \par}

  \vspace{5mm}
  {\huge\bfseries \foreignlanguage{ngerman}{\getTitleGer{}} \par}

  \vspace{10mm}
  \begin{tabular}{l l}
    Author:          & \getAuthor{}         \\
    Supervisor:      & \getSupervisor{}     \\
    Advisors:         & \getAdvisor{}        \\
    Submission Date: & \getSubmissionDate{} \\
  \end{tabular}
  
  
    \vfill{}
    \includegraphics[height=15mm]{example-image-b}
  
\end{titlepage}



\end{document}

У меня два вопроса:

  1. Есть ли способ увеличить отступ строки для части \getTitle{}? Я хочу сохранить размер шрифта и спецификацию vspace{}. По мере того, как заголовок становится длиннее, он имеет тенденцию очень быстро разбиваться на 3-4 строки. Я хочу растянуть его, чтобы получить около 2-3 строк.

  2. Если заголовок слишком длинный, часть с авторством и финал faculty_logo(пример изображения B в фрагменте кода) перейдут на следующую страницу. Есть ли способ всегда фиксировать эти два компонента внизу страницы, не переходя на следующую страницу?

В целом мне нужно 2 заголовка, каждый из которых будет состоять из 3 строк одинаковой длины текста, определенной во фрагменте кода, и все должно располагаться на одной странице.

решение1

Вероятно, достаточно макроса, который создаст , \parboxвыпирающий на поля:

\documentclass[headsepline,footsepline,footinclude=false,oneside,fontsize=11pt,paper=a4,listof=totoc,bibliography=totoc]{scrbook} % one-sided

%---------------------------------------------------------
\newsavebox\scratchbox
\newcommand\boxIntoMargins[4]{%
  \savebox\scratchbox{%
     \mbox{%
       \kern-\dimexpr(#1)\relax
       \parbox[b]{\dimexpr((#1)+(#2)+(#3))\relax}{#4}%
     }%
  }%
  \wd\scratchbox=\linewidth
  \usebox\scratchbox
}%
%---------------------------------------------------------


\usepackage{graphicx}
\usepackage[ngerman,american]{babel}
\newcommand*{\getUniversity}{University of Earth}
\newcommand*{\getFaculty}{Engineering Department}
\newcommand*{\getDegree}{Computer Science}
\newcommand*{\getSchool}{School of Public Science}
\newcommand*{\getTitle}{%
  \boxIntoMargins{1.5cm}{\linewidth}{1.5cm}{%
    \centering
    This is a Long title that I want to stretch the Margin so that instead of 4 lines, it should only be 3 lines, and the logo at the end won't break%
  }%
}
\newcommand*{\getTitleGer}{%
  \boxIntoMargins{1.5cm}{\linewidth}{1.5cm}{%
    \centering
    This is a Long title that I want to stretch the Margin so that instead of 4 lines, it should only be 3 lines, and the logo at the end won't break%
  }%
}
\newcommand*{\getAuthor}{Author}
\newcommand*{\getDoctype}{Thesis}
\newcommand*{\getSupervisor}{Faculty Professor}
\newcommand*{\getAdvisor}{Faculty Advisr}
\newcommand*{\getSubmissionDate}{\today}
\newcommand*{\getSubmissionLocation}{Somewhere In between}

\begin{document}

\begin{titlepage}
  \centering

    \includegraphics[height=20mm]{example-image-a}
  

  \vspace{5mm}
  {\huge\MakeUppercase{School of \getSchool{} --- \getFaculty{}} \par}

  \vspace{5mm}
  {\large\MakeUppercase{\getUniversity{}} \par}

  \vspace{20mm}
  % \vspace{6mm}
  {\Large \getDoctype{} in \getDegree{} \par}

  \vspace{15mm}
  % \vspace{4mm}
  {\huge\bfseries \getTitle{} \par}

  \vspace{5mm}
  {\huge\bfseries \foreignlanguage{ngerman}{\getTitleGer{}} \par}

  \vspace{10mm}
  \begin{tabular}{l l}
    Author:          & \getAuthor{}         \\
    Supervisor:      & \getSupervisor{}     \\
    Advisors:         & \getAdvisor{}        \\
    Submission Date: & \getSubmissionDate{} \\
  \end{tabular}
  
  
    \vfill{}
    \includegraphics[height=15mm]{example-image-b}
  
\end{titlepage}

\end{document}

Скриншот компиляции с использованием Overleaf:

введите описание изображения здесь



В дополнительном комментарии был поднят следующий вопрос:

Я снова забыл настроить значение по умолчанию для шаблона. Высота изображения b должна быть 20 мм, что все равно переносится на вторую страницу. Есть ли способ всегда держать его на одной странице?

Автор первоначальной версии этого ответа предполагает, что не существует способа всегда размещать все на одной странице, поскольку условие наличия слишком большого количества текста для размещения на одной странице всегда можно выполнить, просто добавив больше текста. ;-) И он считает, что попытка автоматизировать настройку вещей для увеличения вероятности размещения вещей на одной странице может не стоить усилий.

Вероятно, вы могли бы поместить содержимое титульного листа в отдельный файл \newsavebox, где его размеры могут превышать размеры бумаги, и объединить использование команды \scaleboxиз пакета graphicxs и команды \useboxдля уменьшения масштаба поля до размера бумаги.

Или иметь титульный лист в отдельном .tex-документе, из которого должен быть создан отдельный .pdf-файл, который, в свою очередь, должен быть включен в ваш основной документ, посредством которого \includegraphicsможет быть выполнено уменьшение масштаба для соответствия размеру бумаги основного документа. В отдельном .tex-документе поле, содержащее титульный лист, который превышает размеры бумаги вашего документа, отправляется после корректировки и \(pdf)pagewidth. \(pdf)pageheightНиже
может быть схема того, как подойти к вопросу таким образом:

\documentclass{article}
\newbox\BoxWithTitlepage
\newcommand\ShipoutAsPage[1]{%
  \begingroup
  \setbox\BoxWithTitlepage=\vbox{%
    \hrule height 0pt
    #1\ifvmode\else\expandafter\endgraf\fi
    \hrule height 0pt
  }%
  \csname @ifundefined\endcsname{pagewidth}{}{\pagewidth=\wd\BoxWithTitlepage}%
  \csname @ifundefined\endcsname{pdfpagewidth}{}{\pdfpagewidth=\wd\BoxWithTitlepage}%
  \csname @ifundefined\endcsname{pageheight}{}{\pageheight=\ht\BoxWithTitlepage
                                               \advance\pageheight\dp\BoxWithTitlepage}%
  \csname @ifundefined\endcsname{pdfpageheight}{}{\pdfpageheight=\ht\BoxWithTitlepage
                                                  \advance\pdfpageheight\dp\BoxWithTitlepage}%
  \shipout\vbox{\kern-1truein\hbox{\kern-1truein\box\BoxWithTitlepage}}%
  \endgroup  
}%
\begin{document}
\ShipoutAsPage{%
  % Content of your titlepage
  % Content of your titlepage
  % Content of your titlepage
  % Content of your titlepage
}%
\end{document}

Но есть веские причины, по которым это не может быть рекомендовано:

  • Таким образом, вы не сможете легко создать гиперссылки с титульного листа на какое-либо другое место документа.
  • Масштабирование будет выглядеть некачественно, поскольку шрифты больше не будут иметь естественный размер.
  • Линии, например, таблиц или изображений, созданных с помощью окружения tikzpicture, и т. п., могут стать слишком тонкими при масштабировании до меньшего размера и, следовательно, не поддаваться печати.

Поэтому вам, вероятно, лучше будет подправить что-то "вручную", например, немного увеличить область шрифта титульного листа к низу бумаги, а также немного сделать кернинг вверх. Ниже приведено "быстрое и грязное" решение, но, вероятно, оно может соответствовать цели:

\documentclass[headsepline,footsepline,footinclude=false,oneside,fontsize=11pt,paper=a4,listof=totoc,bibliography=totoc]{scrbook} % one-sided

%---------------------------------------------------------
\newsavebox\scratchbox
\newcommand\boxIntoMargins[4]{%
  \savebox\scratchbox{%
     \mbox{%
       \kern-\dimexpr(#1)\relax
       \parbox[b]{\dimexpr((#1)+(#2)+(#3))\relax}{#4}%
     }%
  }%
  \wd\scratchbox=\linewidth
  \usebox\scratchbox
}%
%---------------------------------------------------------


\usepackage{graphicx}
\usepackage[ngerman,american]{babel}
\newcommand*{\getUniversity}{University of Earth}
\newcommand*{\getFaculty}{Engineering Department}
\newcommand*{\getDegree}{Computer Science}
\newcommand*{\getSchool}{School of Public Science}
\newcommand*{\getTitle}{%
  \boxIntoMargins{1.5cm}{\linewidth}{1.5cm}{%
    \centering
    This is a Long title that I want to stretch the Margin so that instead of 4 lines, it should only be 3 lines, and the logo at the end won't break%
  }%
}
\newcommand*{\getTitleGer}{%
  \boxIntoMargins{1.5cm}{\linewidth}{1.5cm}{%
    \centering
    This is a Long title that I want to stretch the Margin so that instead of 4 lines, it should only be 3 lines, and the logo at the end won't break%
  }%
}
\newcommand*{\getAuthor}{Author}
\newcommand*{\getDoctype}{Thesis}
\newcommand*{\getSupervisor}{Faculty Professor}
\newcommand*{\getAdvisor}{Faculty Advisr}
\newcommand*{\getSubmissionDate}{\today}
\newcommand*{\getSubmissionLocation}{Somewhere In between}

\begin{document}

\begin{titlepage}
  \enlargethispage{1cm}%
  \hrule height 0mm
  \kern-.5cm

  \centering

    \includegraphics[height=20mm]{example-image-a}
  

  \vspace{5mm}
  {\huge\MakeUppercase{School of \getSchool{} --- \getFaculty{}} \par}

  \vspace{5mm}
  {\large\MakeUppercase{\getUniversity{}} \par}

  \vspace{20mm}
  % \vspace{6mm}
  {\Large \getDoctype{} in \getDegree{} \par}

  \vspace{15mm}
  % \vspace{4mm}
  {\huge\bfseries \getTitle{} \par}

  \vspace{5mm}
  {\huge\bfseries \foreignlanguage{ngerman}{\getTitleGer{}} \par}

  \vspace{10mm}
  \begin{tabular}{l l}
    Author:          & \getAuthor{}         \\
    Supervisor:      & \getSupervisor{}     \\
    Advisors:         & \getAdvisor{}        \\
    Submission Date: & \getSubmissionDate{} \\
  \end{tabular}
  
  
    \vfill{}
    \includegraphics[height=20mm]{example-image-b}
  
\end{titlepage}

\end{document}

введите описание изображения здесь

В случае, если соотношение ⟨высота-верхнего-поля⟩:⟨высота-нижнего-поля⟩ не равно 1:1, вам может потребоваться выполнить немного больше вычислений, чтобы гарантировать, что при вертикальном кернинге вверх и увеличении текстовой области вниз это соотношение по-прежнему сохраняется.

В случае, если соотношение ⟨ширина-поля-слева⟩:⟨ширина-поля-справа⟩ не равно 1:1, вам может потребоваться выполнить немного больше вычислений, чтобы убедиться, что с

\boxIntoMargins{<amount of horizontal space that sticks into left margin>}%
               {\linewidth}%
               {<amount of horizontal space that sticks into right margin>}%
               {...}%

это соотношение сохраняется.


Вероятно, со строкой
{\huge\MakeUppercase{School of \getSchool{} --- \getFaculty{}} \par}
это могло бы выглядеть красиво, если бы все было организовано так, что в случае, если бы и перенос строки происходил прямо перед первым длинным тире, и вся строка, обозначающая факультет, помещалась бы на одной строке сама по себе, длинное тире добавлялось бы позади, \getFaculty{}так что строка факультета была бы вложена между двумя длинными тире. ;-)


Кстати: Код вашего примера напоминает мнеТитульный лист и титульный лист в Scrbook с нежелательной пустой страницей после титульного листа. Вероятно, вы найдете там полезную информацию.

Связанный контент