Почему изображения тянут текст вниз?

Почему изображения тянут текст вниз?

Всякий раз, когда я вставляю картинку, она тянет текст вниз. Я этого не хочу, я хочу, чтобы текст был нормальным, а изображение было там, где оно поместится, либо на текущей странице, либо на следующей, если оно слишком большое.

MWE будет следующим:

\documentclass{book}

\usepackage[utf8]{inputenc}
\usepackage[margin = 2cm]{geometry}
\usepackage{array}
\setlength{\arrayrulewidth}{1mm}
\setlength{\tabcolsep}{18pt}
\renewcommand{\arraystretch}{1.5}
\usepackage{color}
\newcommand{\compl}[1]{ \textcolor{darkblue}{\textbf{\hl{ #1 }}}}
\definecolor{seccol}{rgb}{0,0.8,0.3}

\usepackage{graphicx}

\begin{document}

    In a fully implemented Operating System, any global variables that need to be initialized before they are used, and any library initialization code needs to be called before these libraries cna be used. In our modest project, there are only a couple of libraries, but they need to be initialized nonetheless. Also, the  section must be cleared (i.e we must write a 0 to all addresses in the section). All of this is done in the  function.
    \\
    Although very humble in it's current state, if the project is extended so that more functionality is added, this is where we would call any library initialization code, in order to ensure that everything is setup before any function in a library gets called. 
    \\~\\
    The very first thing we want to do is clear the  section. Thanks to our, we have a label to indicate exactly where this section begins and another label to indicate exactly where it ends, the script also ensures that all  sections of all files get contiguously put together in the final kernel image, so we know that, once we clear this section, all variables that need to be initialized to 0 will contain their correct values. Since the addresses form a continuous block of memory, we can

        In a fully implemented Operating System, any global variables that need to be initialized before they are used, and any library initialization code needs to be called before these libraries cna be used. In our modest project, there are only a couple of libraries, but they need to be initialized nonetheless. Also, the  section must be cleared (i.e we must write a 0 to all addresses in the section). All of this is done in the function.
        \\
        Although very humble in it's current state, if the project is extended so that more functionality is added, this is where we would call any library initialization code, in order to ensure that everything is setup before any function in a library gets called. 
        \\~\\
        The very first thing we want to do is clear the  section. Thanks to our , we have a label to indicate exactly where this section begins and another label to indicate exactly where it ends, the script also ensures that all sections of all files get contiguously put together in the final kernel image, so we know that, once we clear this section, all variables that need to be initialized to 0 will contain their correct values. Since the addresses form a continuous block of memory, we can

                The very first thing we want to do is clear the  section. Thanks to our , we have a label to indicate exactly where this section begins and another label to indicate exactly where it ends, the script also ensures that all sections of all files get contiguously put together in the final kernel image, so we know that, once we clear this section, all variables that need to be initialized to 0 will contain their correct values. Since the addresses form a continuous block of memory, we can
\centering
\includegraphics{FramebufferDiagram.png}
\end{document}

[1]: https://i.stack.imgur.com/7lNПф.png

решение1

Вам нужно поместить вашу картинку в figureсреду, чтобы она парила:

\begin{figure}
\centering
\includegraphics{FramebufferDiagram.png}
\end{figure}

Вы можете добавить необязательный аргумент для настройки позиционирования. hfor here (где он появляется в исходном коде), tfor at the top of a page и/или bfor at the bottom of a page ( \begin{figure}[ht]для размещения его здесь или, если он не помещается, в верхней части следующей страницы).

Примечание: ваш текст занимает только около половины страницы. И поскольку вы используете bookкласс, он все равно будет растянут, пока вы не добавите больше текста. Это происходит потому, что bookкласс пытается сделать все страницы одинаковой высоты.

Редактировать:

Чтобы избежать растяжения страницы, помещенной \raggedbottomв преамбулу, LaTeX больше не будет пытаться сделать все страницы одинаковой высоты.

Кстати: Поскольку вы не хотите, чтобы изображение плавало, могу порекомендовать поместить \centeringи \includegraphicsв группу ( {...}). Таким образом, текст после изображения больше не будет центрироваться. (Я думаю, вы этого не хотите.)

решение2

Слишком длинный комментарий: \raggedbottomне решают, что использование \\~\\вместопустая строка (= \par)оставлять пустую строку между абзацами совершенно неправильно. Вы вставляете только два переноса строк в пределахабзац. Даже в этом случае пропуски абзацев отличаются, и в поддельных абзацах нет отступов.

Более того, вы поместили \centeringперед окончанием последнего абзаца, так что не только изображение центрируется, но и последний абзац. Изображение также является частью абзаца и действует как огромный символ, поэтому при меньшей высоте будет заканчиваться на той же строке, что и "...memory, we can". В противном случае перейдем на следующую страницу, но оставим "дыру" около 10 см. Затем LaTeX использует резиновые интервалы между настоящими абзацами, которые растягиваются, чтобы сделать текст выровненным по вертикали. Это произойдет, даже если изображение находится в другом абзаце.

Если вам нужен фиксированный интервал между абзацами, следует использовать команду:

\setlength{\parskip}{\baselineskip}

Обратите внимание, что в этом нет необходимости, \raggedbottomпоскольку теперь абзац имеет фиксированную длину, а не резиновую.

Тем не менее, обычно гораздо лучше оставлять гибкую длину (но одинаковую во всех абзацах страницы), например:

\setlength{\parskip}{.5em plus .1em minus .1em}      

или проще: используйте пакет parskipв преамбуле.

В этом случае это, по-видимому, не является хорошим решением, поскольку вы заставляете Latex выбирать между одним злом и другим (оставлять около половины страницы пустой или оставлять большое пространство между абзацами, даже далеко от того, что вы хотели). Решение в этом случае, как хорошо заметил Густаво Меццетти, плавающий элемент с hили параметрами t, pпоскольку тогда изображение больше не является частью обычного абзаца.

Стоит отметить, что плавающий формат также обычно предпочтительнее, поскольку он позволяет оставить достаточно места между рисунком и текстом выше и/или ниже (а также позволяет размещать пронумерованные подписи, списки рисунков, центрировать по вертикали отдельные изображения и т. д.).

MWE без поплавка:

мве

\documentclass{book}
\usepackage[margin=2cm]{geometry}
\setlength{\parskip}{\baselineskip}
\usepackage{graphicx}
\usepackage{kantlipsum} % allow \kant[n] for dummy paragraphs
\begin{document}
\kant[2]\par\kant[1]\par\kant[2]\par\kant[1]\par

\centering
\includegraphics[height=12cm]{example-image}
\end{document}

MWE с поплавком:

мве

\documentclass{book}
\usepackage[margin=2cm]{geometry}
\setlength{\parskip}{.5em plus .1em minus .5em}
\usepackage{graphicx}
\usepackage{kantlipsum} % allow \kant[n] for dummy paragraphs
\begin{document}
\kant[2]\par\kant[1]\par\kant[2]\par\kant[1]
\begin{figure}[h]
\centering
\includegraphics[height=12cm]{example-image}
\end{figure}
\end{document}

Примечание: \par(=пустая строка) уже подразумевается в \kantмакросах, но я оставляю это в MWE, чтобы отметить, что абзацы заканчиваются \par(и потому что лишние \par, конечно, игнорируются).

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