ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* changing alignment inside a paragraph
@ 2019-12-10 11:27 mf
  2019-12-10 17:07 ` Wolfgang Schuster
  2019-12-11 14:31 ` mf
  0 siblings, 2 replies; 6+ messages in thread
From: mf @ 2019-12-10 11:27 UTC (permalink / raw)
  To: mailing list for ConTeXt users

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
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: changing alignment inside a paragraph
  2019-12-10 11:27 changing alignment inside a paragraph mf
@ 2019-12-10 17:07 ` Wolfgang Schuster
  2019-12-11 14:31 ` mf
  1 sibling, 0 replies; 6+ messages in thread
From: Wolfgang Schuster @ 2019-12-10 17:07 UTC (permalink / raw)
  To: mailing list for ConTeXt users, mf

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

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: changing alignment inside a paragraph
  2019-12-10 11:27 changing alignment inside a paragraph mf
  2019-12-10 17:07 ` Wolfgang Schuster
@ 2019-12-11 14:31 ` mf
  2019-12-11 20:25   ` Wolfgang Schuster
  1 sibling, 1 reply; 6+ messages in thread
From: mf @ 2019-12-11 14:31 UTC (permalink / raw)
  To: mailing list for ConTeXt users

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
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: changing alignment inside a paragraph
  2019-12-11 14:31 ` mf
@ 2019-12-11 20:25   ` Wolfgang Schuster
  2019-12-12 14:56     ` mf
  0 siblings, 1 reply; 6+ messages in thread
From: Wolfgang Schuster @ 2019-12-11 20:25 UTC (permalink / raw)
  To: mailing list for ConTeXt users, mf



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

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: changing alignment inside a paragraph
  2019-12-11 20:25   ` Wolfgang Schuster
@ 2019-12-12 14:56     ` mf
  2019-12-12 20:43       ` Wolfgang Schuster
  0 siblings, 1 reply; 6+ messages in thread
From: mf @ 2019-12-12 14:56 UTC (permalink / raw)
  To: Wolfgang Schuster, mailing list for ConTeXt users

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
--------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: changing alignment inside a paragraph
  2019-12-12 14:56     ` mf
@ 2019-12-12 20:43       ` Wolfgang Schuster
  0 siblings, 0 replies; 6+ messages in thread
From: Wolfgang Schuster @ 2019-12-12 20:43 UTC (permalink / raw)
  To: mf; +Cc: mailing list for ConTeXt users

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

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-12-12 20:43 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-10 11:27 changing alignment inside a paragraph mf
2019-12-10 17:07 ` Wolfgang Schuster
2019-12-11 14:31 ` mf
2019-12-11 20:25   ` Wolfgang Schuster
2019-12-12 14:56     ` mf
2019-12-12 20:43       ` Wolfgang Schuster

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).