使段落格式适用于所有环境,但不适用于短段落

使段落格式适用于所有环境,但不适用于短段落

我知道这是一个非常具体的问题,但我一直在尝试让所有段落都变成完美的矩形,就像StackExchange 问题。和这些旧帖子一样,我也遇到了同样的问题。但我仍在努力让问题变得不那么严重。

  1. 第一个问题可能更容易解决:对 parfillskip 和其他参数的更改不会在任何环境中生效,例如以下示例中的 enumerate 和 itemize。但我还想在那里设置矩形段落。
  2. 这可能更难修复,这只是我的一个想法。是否可以仅在段落超过一定长度时才应用对长度的更改?也许有某种方法可以获取段落的长度,然后仅在长度大于某个给定长度时才使用序言中的 \setlength。

我也意识到这并不是 LaTeX 的真正意图,因为外观应该是不太重要的部分,但我仍然想对它进行一些实验。

这是一个显示问题的最小工作示例

\documentclass[a4paper]{article}

\usepackage{blindtext}           
\usepackage{lmodern}

\usepackage[stretch=30]{microtype}
\usepackage{etoolbox}

% Enbale rectangular paragraphs
\setlength{\parindent}{0pt}
\setlength{\parskip}{.5\baselineskip}
\setlength{\parfillskip}{0pt}
\setlength{\emergencystretch}{.5\textwidth}
\makeatletter
\patchcmd{\@sect}{\begingroup}{\begingroup\parfillskip=0pt plus 1fil\relax}{}{}
\patchcmd{\@ssect}{\begingroup}{\begingroup\parfillskip=0pt plus 1fil\relax}{}{}
\makeatother

\begin{document}
Too short paragraph that gets ruined and where the changed lengths should not apply
\section{Lorem ipsum}
\blindtext
\begin{itemize} % No affect here
\item \blindtext
\end{itemize}
\begin{enumerate} % No affect here
\item \blindtext
\end{enumerate}
\end{document}

答案1

不幸的是,我无法完全解决所有问题,但我现在创建了一个环境,它只在行数足够多以至于空格不会太大时才更改 parfillskip 之类的东西。环境仍然存在问题 1,并且节的枚举等也变得混乱:

\documentclass[a4paper]{article}

\usepackage{blindtext}           
\usepackage{microtype}

\usepackage{calc}
\usepackage{etoolbox}
\usepackage{pgf}

% Standard changes to paragraphs
\setlength{\parindent}{0pt}
\setlength{\parskip}{.5\baselineskip}

\makeatletter
\patchcmd{\@sect}{\begingroup}{\begingroup\parfillskip=0pt plus 1fil\relax}{}{}
\patchcmd{\@ssect}{\begingroup}{\begingroup\parfillskip=0pt plus 1fil\relax}{}{}
\makeatother

% Get lengths to count lines
\newlength{\parline}
\newlength{\paroutindent}
\newlength{\lineheight}
\setlength{\lineheight}{\heightof{abcdefghijklmnoprstuvwxyzüäöß}}

\newcommand{\txtblck}[1]{
\setlength{\paroutindent}{\expandafter\parindent}
\setlength{\parline}{\heightof{\noindent\begin{minipage}{\linewidth}
            \setlength{\parindent}{\paroutindent}#1\end{minipage}}}
\pgfmathparse{round(\parline / (0.9*\lineheight))}

\ifdim\pgfmathresult pt > 3.0pt % Text is long enough -> Rectangular    
        \setlength{\emergencystretch}{.5\textwidth}
    \setlength{\parfillskip}{0pt}
    #1
    
    % Reset values
    \setlength{\emergencystretch}{11.8 pt}
    \setlength{\parfillskip}{0pt plus 1fil}
\else % Text is too short for perfect rectangle
    #1
\fi
}

\begin{document}
\section{Test}
\txtblck{\section{Lorem ipsum}
\blinddocument}
But this is unaffected
\txtblck{As well as this}
\end{document}

可以尝试通过改变行数的计算方式来解决这个问题,因为我认为这是章节编号增加太多的原因

相关内容