Hello list, is there a way to achieve this? \def\FlushRightFromNextLine{\relax} \setupnarrower[left=0cm,right=11cm] \setupalign[stretch] \starttext This is what I'd like to type in my source:\par \blank \type{This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line \FlushRightFromNextLine 34, 57, 101-104, 276, 345, 401-403.}\par \blank This is the normal result:\par \blank \startnarrower[right] This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line \FlushRightFromNextLine 34, 57, 101-104, 276, 345, 401-403. \stopnarrower \blank This is the expected result:\par \blank \startnarrower[right] \parfillskip=0pt This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line 34, 57,\par \penalty10000 % no page break in the middle of page numbers \startalignment[flushright] 101-104, 276, 345, 401-403.\par \stopalignment \stopnarrower \stoptext The expected result is to be intended visually, because there might be no need to break the text into two paragraphs. Thanks, Massi
mf schrieb am 10.12.2019 um 12:27:
Hello list, is there a way to achieve this?
\def\FlushRightFromNextLine{\relax} \setupnarrower[left=0cm,right=11cm] \setupalign[stretch] \starttext This is what I'd like to type in my source:\par \blank \type{This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line \FlushRightFromNextLine 34, 57, 101-104, 276, 345, 401-403.}\par \blank This is the normal result:\par \blank \startnarrower[right] This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line \FlushRightFromNextLine 34, 57, 101-104, 276, 345, 401-403. \stopnarrower \blank This is the expected result:\par \blank \startnarrower[right] \parfillskip=0pt This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line 34, 57,\par \penalty10000 % no page break in the middle of page numbers \startalignment[flushright] 101-104, 276, 345, 401-403.\par \stopalignment \stopnarrower \stoptext
The expected result is to be intended visually, because there might be no need to break the text into two paragraphs.
Use the "end" keyword for the alignment. \starttext \startbuffer This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line 34, 57, 101-104, 276, 345, 401–403. \stopbuffer \typebuffer \getbuffer \startbuffer \startalignment[end] This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line 34, 57, 101-104, 276, 345, 401–403. \stopalignment \stopbuffer \typebuffer \getbuffer \stoptext Wolfgang
This is a good-enough solution to my problem: \setupalign[stretch] \starttext \def\Text{This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line} \def\Pages{34, 57, 101-104, 276, 345, 401, 403, 512.} \type{\PlaceIndexTerm} has 6 parameters: \startitemize[n] \item the main text \item the pages' numbers \item the text width \item the left margin of the lines made only of page numbers \item the width of the separator (an hbox) before the first page number, when there's room in the last line of the text \item the minimum accepted space left at the end of the last line of text, to put a page number \stopitemize \def\PlaceIndexTerm#1#2#3#4#5#6{% \newdimen\TextWidth \TextWidth=#3 \newdimen\SBPN \SBPN=#5 % space before page numbers \newdimen\PagesIndentation \PagesIndentation=#4 \newdimen\MSLLL \MSLLL=#6 % minimum space left on last line \parshape 1 0pt \TextWidth #1\par \newdimen\LLW \LLW=\lastlinewidth \page[no] \ifdim \dimexpr\TextWidth-\LLW-\SBPN > \MSLLL \blank[-\the\lineheight,fixed]\fi \startalignment[flushright,stretch] \ifdim \dimexpr\TextWidth-\LLW-\SBPN > \MSLLL \parshape 2 \LLW \dimexpr \TextWidth - \LLW \PagesIndentation \dimexpr \TextWidth - \PagesIndentation \red \else \parshape 1 \PagesIndentation \dimexpr \TextWidth - \PagesIndentation \darkgreen \fi \noindent\ifdim \dimexpr\TextWidth-\LLW-\SBPN > \MSLLL\hbox to \SBPN{}\fi #2\par \stopalignment} \def\PlaceIndexTermDescribed#1#2#3#4#5#6{% \newdimen\TW\TW=#3 \noindent{\tfx width={\bf \PtToCm{\the\TW}}, pages' left margin (2nd line)={\bf #4}, hbox before pages={\bf #5},\\% min space left on last line of text={\bf #6}}\par \blank[halfline] \PlaceIndexTerm{#1}{#2}{#3}{#4}{#5}{#6} \blank} \page \PlaceIndexTermDescribed{\Text}{\Pages}{3cm}{12pt}{1em}{12pt} In this case there's no space left on the last line of text, so the page numbers are flushed to the right, starting from a new line. \page \PlaceIndexTermDescribed{\Text}{\Pages}{3.5cm}{12pt}{1em}{12pt} Now the last line of text is short and there's room to start the page numbers on the same line. The remainder of page numbers is flushed right, with a (min) left margin of 12pt.\par Actually, the page numbers are started in a new paragraph with a \type{\parshape} that depends on the last line of the text; then the new paragraph is moved upwards with a \type{\blank[-\the\lineheight,fixed]}. A \type{\page[no]} before the \type{\blank} guarantees that no page break occurs between text and numbers. \page \PlaceIndexTermDescribed{\Text}{\Pages}{4cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{4.5cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{5cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{5.5cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{6cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{6.5cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{7cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{7.5cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{8cm}{12pt}{1em}{12pt} That \type{512} left on the last line is ugly, and we can trim the separator hbox from \type{1em} to \type{.1em} to let all the page numbers fit in the last line:\par \blank \PlaceIndexTermDescribed{\Text}{\Pages}{8cm}{12pt}{.1em}{12pt} or we could increase the left margin of the lines made only of page numbers (to \type{3cm} in this case), to distribute the numbers better across the two lines:\par \blank \PlaceIndexTermDescribed{\Text}{\Pages}{8cm}{3cm}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{8.5cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{9cm}{12pt}{1em}{12pt} \page \PlaceIndexTermDescribed{\Text}{\Pages}{9.5cm}{12pt}{1em}{12pt} Increasing the left margin of the lines of page numbers gives a better result:\par \blank \PlaceIndexTermDescribed{\Text}{\Pages}{9.5cm}{4cm}{1em}{12pt} \page Full text width (third parameter set to \type{\textwidth}):\par \blank \PlaceIndexTermDescribed{\Text}{\Pages}{\textwidth}{12pt}{1em}{12pt} \stoptext (Thanks again to Wolfgang for answering my question) Massi
mf schrieb am 11.12.2019 um 15:31:
This is a good-enough solution to my problem:
\setupalign[stretch]
\starttext
\def\Text{This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line}
\def\Pages{34, 57, 101-104, 276, 345, 401, 403, 512.}
\type{\PlaceIndexTerm} has 6 parameters: \startitemize[n] \item the main text \item the pages' numbers \item the text width \item the left margin of the lines made only of page numbers \item the width of the separator (an hbox) before the first page number, when there's room in the last line of the text \item the minimum accepted space left at the end of the last line of text, to put a page number \stopitemize
\def\PlaceIndexTerm#1#2#3#4#5#6{% \newdimen\TextWidth \TextWidth=#3 \newdimen\SBPN \SBPN=#5 % space before page numbers \newdimen\PagesIndentation \PagesIndentation=#4 \newdimen\MSLLL \MSLLL=#6 % minimum space left on last line \parshape 1 0pt \TextWidth #1\par \newdimen\LLW \LLW=\lastlinewidth \page[no] \ifdim \dimexpr\TextWidth-\LLW-\SBPN > \MSLLL \blank[-\the\lineheight,fixed]\fi \startalignment[flushright,stretch] \ifdim \dimexpr\TextWidth-\LLW-\SBPN > \MSLLL \parshape 2 \LLW \dimexpr \TextWidth - \LLW \PagesIndentation \dimexpr \TextWidth - \PagesIndentation \red \else \parshape 1 \PagesIndentation \dimexpr \TextWidth - \PagesIndentation \darkgreen \fi \noindent\ifdim \dimexpr\TextWidth-\LLW-\SBPN > \MSLLL\hbox to \SBPN{}\fi #2\par \stopalignment}
\starttext \startbuffer This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line\par \startalignment[flushright] \ifdim\dimexpr\hsize-\lastlinewidth\relax>2\emwidth \blank[overlay] % simple solution but doesn't indent the numbers on the following lines % \hskip\dimexpr\lastlinewidth+\emwidth\relax \parshape 2 \dimexpr\lastlinewidth+\emwidth\relax \dimexpr\hsize-\lastlinewidth-\emwidth\relax \emwidth \dimexpr\hsize-\emwidth\relax \else \parshape 1 \emwidth \dimexpr\hsize-\emwidth\relax \fi 34, 57, 101-104, 276, 345, 401, 403, 512. \stopalignment \stopbuffer \dorecurse {10} {\hsize\dimexpr.75\textwidth-#1\emwidth\relax \getbuffer \page} \stoptext Wolfgang
Il 11/12/19 21:25, Wolfgang Schuster ha scritto:
\starttext
\startbuffer This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line\par \startalignment[flushright] \ifdim\dimexpr\hsize-\lastlinewidth\relax>2\emwidth \blank[overlay] % simple solution but doesn't indent the numbers on the following lines % \hskip\dimexpr\lastlinewidth+\emwidth\relax \parshape 2 \dimexpr\lastlinewidth+\emwidth\relax \dimexpr\hsize-\lastlinewidth-\emwidth\relax \emwidth \dimexpr\hsize-\emwidth\relax \else \parshape 1 \emwidth \dimexpr\hsize-\emwidth\relax \fi 34, 57, 101-104, 276, 345, 401, 403, 512. \stopalignment \stopbuffer
\dorecurse {10} {\hsize\dimexpr.75\textwidth-#1\emwidth\relax \getbuffer \page}
\stoptext
Thanks Wolfgang. I wrote a better version. I still have a couple of questions. In the lines: \iffirstargument \getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,#1] \else \getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,] \fi i would avoid writing the default values twice; i tried something like: \getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,\iffirstargument#1\fi] but it doesn't work. For the second question, see the first item of page 3: i think the \lastlinewidth fails because there's a page break. From supp-box.lua: implement { name = "lastlinewidth", actions = function() local head = tex.lists.page_head -- list dimensions returns 3 value but we take the first context(head and getdimensions(getlist(find_tail(tonut(tex.lists.page_head)))) or 0) end } I think that's because page_head is reset in the page break. Is there a way to prevent that? Massi -------------------------------------------------------------- \unprotect \def\PlaceIndexTerm{\dosingleempty\doPlaceIndexTerm} \def\doPlaceIndexTerm[#1]#2#3{% \iffirstargument \getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,#1] \else \getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,] \fi #2\par \startalignment[flushright,stretch] \ifdim\dimexpr\hsize-\lastlinewidth\relax > \dimexpr\PIT!distance+\PIT!minwidth\relax \blank[overlay] \parshape 2 \dimexpr\lastlinewidth+\PIT!distance\relax \dimexpr\hsize-\lastlinewidth-\PIT!distance\relax \PIT!margin \dimexpr\hsize-\PIT!margin\relax \doif{\PIT!test}{on}{\red} \else \page[no] \parshape 1 \PIT!margin \dimexpr\hsize-\PIT!margin\relax \doif{\PIT!test}{on}{\darkgreen} \fi #3\par \stopalignment} \protect \setupalign[stretch] \starttext \def\Text{This is the text of an index term, that is normally justified, but I'd like the page numbers to be flushed to the right from their second line} \def\Pages{34, 57, 101-104, 276, 345, 401, 403, 512.} \type{\PlaceIndexTerm[margin=1em,distance=1em,minwidth=1em]{text}{pages}} \startitemize \item margin: the left margin of the lines made only of page numbers \item distance: the distance of the first page number from the last word of the text \item minwidth: the shortest acceptable space at the end of the text to try to start page numbers there \stopitemize \page \dorecurse {23} {\hsize=\dimexpr5cm+#1\emwidth\relax #1: \the\hsize\par \PlaceIndexTerm[test=on]{\Text}{\Pages}} \stoptext --------------------------------------------------------------
mf schrieb am 12.12.2019 um 15:56:
I wrote a better version. I still have a couple of questions. In the lines:
\iffirstargument \getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,#1] \else \getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,] \fi
i would avoid writing the default values twice; i tried something like:
\getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,\iffirstargument#1\fi]
but it doesn't work. Skip the argument check and use just this:
\getparameters[PIT!][test=off,margin=1em,distance=1em,minwidth=1em,#1] Wolfgang
participants (2)
-
mf
-
Wolfgang Schuster