From 272289901e0573de069c6f4b6552c0d49ce00de2 Mon Sep 17 00:00:00 2001 From: daniel Date: Sun, 2 Feb 2025 11:38:16 +0100 Subject: [PATCH 1/3] Tweakable orphaned sections - revive old PR (#231) * introduce different first and lastname styles. * fix orphaned section headers (needs testing). Closes #10. * introduce \cvsectionstretchability and \cvsubsectionstretchability * set default stretchability to 0.9\baselineskip * add fix orphaned section notice to changelog --------- Co-authored-by: David --- CHANGELOG | 7 +++++++ moderncv.cls | 30 ++++++++++++++++++++++++++++++ moderncvbodyi.sty | 11 +++++++++++ moderncvbodyiii.sty | 10 ++++++++++ moderncvbodyiv.sty | 10 ++++++++++ moderncvbodyv.sty | 11 +++++++++++ 6 files changed, 79 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index a10c6b0..223f7bb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,13 @@ version next - Fix spacing between first and last name again (#220) - Make header details flush against sides for casual, classic, and contemporary styles (#229) +- partially fix orphaned section headers for singualar use of \section and \subsection + commands and give users the new adjustable lengths \cvsectionstretchability + and \subsectionstretchability. In case \section and \subsection are used + directly one after the other, an orphaned section header might still occur. + This is structural and should be solved by \newpage instead of increasing + \cvsectionstretchability (#10/#226). + version 2.4.1 (18 Jul 2024) - Fix commons/colors.tex not found in package (#194) diff --git a/moderncv.cls b/moderncv.cls index 20cedc8..01bdea7 100644 --- a/moderncv.cls +++ b/moderncv.cls @@ -479,6 +479,36 @@ \newcommand*{\@moderncvstrut}[2]{% \rule[-#1]{0pt}{#2}} +% custom needspace command to avoid orphaned sections +% adapted from the explanations given on +% https://tex.stackexchange.com/questions/348994/understanding-needspace +% the stretchabilities are zero by default and are only there to be changed +% by the user if needed. +\@initializelength{\cvsectionstretchability} +\@initializelength{\cvsubsectionstretchability} +% set the default stretchability. +\setlength{\cvsectionstretchability}{.9\baselineskip} +\setlength{\cvsubsectionstretchability}{.9\baselineskip} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% This is where the page break should occur, so this number should not bee too high +\NewDocumentCommand\withinstretchpenalty{}{0} +% must be between -100 and 9999. The higher the less likely a page break will occur. +\NewDocumentCommand\poststretchpenalty{}{9999} +% command intended to use with section definitions to avoid orphaned sections. (Pagebreak bewteen +% \section{} and cv content e.g. \cvitem{}. +% usage \@cvneedspace{} preferably \cvneedspace{\cvstretchability} to allow the user +% to adapt as needed. +\NewDocumentCommand\@cvneedspace{m}{% + \begingroup + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@ + \penalty \withinstretchpenalty\vskip\z@\@plus -\dimen@ + \vskip\dimen@ + \penalty \poststretchpenalty% + \vskip -\dimen@ + \vskip\z@skip % hide the previous |\vskip| from |\addvspace| + \endgroup +} %------------------------------------------------------------------------------- % resume design commands definitions diff --git a/moderncvbodyi.sty b/moderncvbodyi.sty index d3db954..39172e7 100644 --- a/moderncvbodyi.sty +++ b/moderncvbodyi.sty @@ -74,7 +74,17 @@ \@initializelength{\baseletterheight} \settoheight{\baseletterheight}{\sectionstyle{o}} \setlength{\baseletterheight}{\baseletterheight-0.95ex} + +% leave the stretchability zero by default +% \setlength{\cvsectionstretchability}{0.0pt} +% \setlength{\cvsubsectionstretchability}{0.0pt} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% This is where the page break should occur, so this number should not bee too high +% \RenewDocumentCommand\withinstretchpenalty{}{0} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% \RenewDocumentCommand\poststretchpenalty{}{9999} \RenewDocumentCommand{\section}{sm}{% + \@cvneedspace{\cvsectionstretchability}% avoid orphaned sections \par\addvspace{2.5ex}% \phantomsection{}% reset the anchor for hyperrefs \addcontentsline{toc}{section}{#2}% @@ -82,6 +92,7 @@ \par\nobreak\addvspace{1ex}\@afterheading}% to avoid a pagebreak after the heading \RenewDocumentCommand{\subsection}{sm}{% + \@cvneedspace{\cvsubsectionstretchability}% avoid orphaned sections \par\addvspace{1ex}% \phantomsection{}% reset the anchor for hyperrefs \addcontentsline{toc}{subsection}{#2}% diff --git a/moderncvbodyiii.sty b/moderncvbodyiii.sty index 37d8d13..dc1d132 100644 --- a/moderncvbodyiii.sty +++ b/moderncvbodyiii.sty @@ -107,7 +107,16 @@ % regular lengths \setlength{\parskip}{0\p@}} +% leave the stretchability zero by default +% \setlength{\cvsectionstretchability}{0.0pt} +% \setlength{\cvsubsectionstretchability}{0.0pt} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% This is where the page break should occur, so this number should not bee too high +% \RenewDocumentCommand\withinstretchpenalty{}{0} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% \RenewDocumentCommand\poststretchpenalty{}{9999} \RenewDocumentCommand{\section}{sm}{% + \@cvneedspace{\cvsectionstretchability}% avoid orphaned sections \par\addvspace{2.5ex}% \phantomsection{}% reset the anchor for hyperrefs \addcontentsline{toc}{section}{#2}% @@ -123,6 +132,7 @@ \par\nobreak\addvspace{1ex}\@afterheading} \RenewDocumentCommand{\subsection}{sm}{% + \@cvneedspace{\cvsubsectionstretchability}% avoid orphaned sections \par\addvspace{1ex}% \phantomsection{}% \addcontentsline{toc}{subsection}{#2}% diff --git a/moderncvbodyiv.sty b/moderncvbodyiv.sty index 0d9fe6f..039a0ef 100644 --- a/moderncvbodyiv.sty +++ b/moderncvbodyiv.sty @@ -69,7 +69,16 @@ % regular lengths \setlength{\parskip}{0\p@}} +% leave the stretchability zero by default +% \setlength{\cvsectionstretchability}{0.0pt} +% \setlength{\cvsubsectionstretchability}{0.0pt} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% This is where the page break should occur, so this number should not bee too high +% \RenewDocumentCommand\withinstretchpenalty{}{0} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% \RenewDocumentCommand\poststretchpenalty{}{9999} \RenewDocumentCommand{\section}{sm}{% + \@cvneedspace{\cvsectionstretchability}% avoid orphaned sections \par\addvspace{2.5ex}% \phantomsection{}% reset the anchor for hyperrefs \addcontentsline{toc}{section}{#2}% @@ -77,6 +86,7 @@ \par\nobreak\addvspace{1ex}\@afterheading} \RenewDocumentCommand{\subsection}{sm}{% + \@cvneedspace{\cvsubsectionstretchability}% avoid orphaned sections \par\addvspace{1ex}% \phantomsection{}% \addcontentsline{toc}{subsection}{#2}% diff --git a/moderncvbodyv.sty b/moderncvbodyv.sty index f29e577..1e4a417 100644 --- a/moderncvbodyv.sty +++ b/moderncvbodyv.sty @@ -72,8 +72,18 @@ % regular lengths \setlength{\parskip}{0\p@}} +% leave the stretchability zero by default +% \setlength{\cvsectionstretchability}{0.0pt} +% \setlength{\cvsubsectionstretchability}{0.0pt} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% This is where the page break should occur, so this number should not bee too high +% \RenewDocumentCommand\withinstretchpenalty{}{0} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% \RenewDocumentCommand\poststretchpenalty{}{9999} + \@initializeif{\if@aftersection}\@aftersectionfalse% \RenewDocumentCommand{\section}{sm}{% + \@cvneedspace{\cvsectionstretchability}% avoid orphaned sections \addvspace{2.5ex}% \phantomsection{}% reset the anchor for hyperrefs \addcontentsline{toc}{section}{#2}% @@ -83,6 +93,7 @@ %\@initializeif{\if@aftersubsection}\@aftersubsectionfalse% \RenewDocumentCommand{\subsection}{sm}{% + \@cvneedspace{\cvsubsectionstretchability}% avoid orphaned sections %\addvspace{1ex}% \vspace*{-\arrayrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :( \if@aftersection% From a4445849d249d69be2fe1fec3f91aff5b3ffdcd0 Mon Sep 17 00:00:00 2001 From: LLdaniel Date: Sun, 2 Feb 2025 11:51:07 +0100 Subject: [PATCH 2/3] incorporate comments from the code review on the original PR #57 --- manual/moderncv_userguide.tex | 2 +- moderncv.cls | 4 ++-- moderncvbodyvi.sty | 12 ++++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/manual/moderncv_userguide.tex b/manual/moderncv_userguide.tex index feb6f31..ab0d8c0 100644 --- a/manual/moderncv_userguide.tex +++ b/manual/moderncv_userguide.tex @@ -937,7 +937,7 @@ If \Latex breaks pages just after \code{\\section} or \code{\\subsection} comman \setlength{\cvsubsectionstretchability}{100pt} \end{lstlisting} These two lengths tell \Latex how much extra length it needs after \code{\\section} and \code{\\subsection} commands. -By default, \Moderncv sets both lengths to \code{0.9\\baselineskip}. +By default, \Moderncv sets both lengths to \code{0pt} by default. This should solve orphaned \code{\\section} and \code{\\subsection} commands that are used alone for most users. However, \Latex does not check for content. diff --git a/moderncv.cls b/moderncv.cls index 01bdea7..810e7c6 100644 --- a/moderncv.cls +++ b/moderncv.cls @@ -487,8 +487,8 @@ \@initializelength{\cvsectionstretchability} \@initializelength{\cvsubsectionstretchability} % set the default stretchability. -\setlength{\cvsectionstretchability}{.9\baselineskip} -\setlength{\cvsubsectionstretchability}{.9\baselineskip} +\setlength{\cvsectionstretchability}{0pt} +\setlength{\cvsubsectionstretchability}{0pt} % must be between -100 and 9999. The higher the less likely a page break will occur. % This is where the page break should occur, so this number should not bee too high \NewDocumentCommand\withinstretchpenalty{}{0} diff --git a/moderncvbodyvi.sty b/moderncvbodyvi.sty index 76e1a15..74a5ce9 100644 --- a/moderncvbodyvi.sty +++ b/moderncvbodyvi.sty @@ -79,7 +79,18 @@ \setlength{\baseletterheight}{\baseletterheight-0.95ex} % The optional argument can be used to place a small icon near the section name. % E.g. `\section[\faBookmark]{Education}` +% +% +% leave the stretchability zero by default +% \setlength{\cvsectionstretchability}{0.0pt} +% \setlength{\cvsubsectionstretchability}{0.0pt} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% This is where the page break should occur, so this number should not bee too high +% \RenewDocumentCommand\withinstretchpenalty{}{0} +% must be between -100 and 9999. The higher the less likely a page break will occur. +% \RenewDocumentCommand\poststretchpenalty{}{9999} \RenewDocumentCommand{\section}{sO{}m}{% + \@cvneedspace{\cvsectionstretchability}% avoid orphaned sections \tl@resetchain% \par\addvspace{2.5ex}% \phantomsection{}% reset the anchor for hyperrefs @@ -89,6 +100,7 @@ \par\nobreak\addvspace{1ex}\@afterheading}% to avoid a pagebreak after the heading \RenewDocumentCommand{\subsection}{sm}{% + \@cvneedspace{\cvsubsectionstretchability}% avoid orphaned sections \par\addvspace{1ex}% \phantomsection{}% reset the anchor for hyperrefs \addcontentsline{toc}{subsection}{#2}% From 12be32298a4793e48088851ef19ae9b9fa5e840a Mon Sep 17 00:00:00 2001 From: LLdaniel Date: Sun, 2 Feb 2025 12:07:26 +0100 Subject: [PATCH 3/3] also re-compile the userguide due to the new default value --- manual/moderncv_userguide.pdf | Bin 123425 -> 123415 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/manual/moderncv_userguide.pdf b/manual/moderncv_userguide.pdf index 0468a22e0fdcc0a3b3e23515f663d623623a46a7..ff1a48d19211640e5aa40f0b78edf31f46644934 100644 GIT binary patch delta 6274 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 delta 6273 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