ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Wolfgang Schuster <schuster.wolfgang@googlemail.com>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: ntg-context Digest, Vol 67, Issue 18
Date: Tue, 12 Jan 2010 23:02:10 +0100	[thread overview]
Message-ID: <D822561F-1064-4907-9CDD-30187A53E741@googlemail.com> (raw)
In-Reply-To: <alpine.LNX.2.01.1001121220270.29466@ybpnyubfg.ybpnyqbznva>

[-- Attachment #1: Type: text/plain, Size: 1 bytes --]



[-- Attachment #2: position.tex --]
[-- Type: application/octet-stream, Size: 279 bytes --]

\usemodule[ruby]

\usetypescript[modern-base]
\setupbodyfont[modern-base]

\setupinterlinespace[line=3.6ex]

\starttext

\dorecurse{100}{a  b c d e f g h i \ruby{j}{text} k l m n o p q r s }
%\dorecurse{100}{a  b c d e f g h i \ruby{j}{text} k l m n o p q r s t u v }

\stoptext

[-- Attachment #3: t-ruby.tex --]
[-- Type: application/octet-stream, Size: 10085 bytes --]

%D \module
%D   [     file=t-ruby,
%D      version=2009.12.13,
%D        title=\CONTEXT\ User Module,
%D     subtitle=Ruby Markup,
%D       author=Wolfgang Schuster,
%D         date=\currentdate,
%D    copyright=Wolfgang Schuster,
%D        email=schuster.wolfgang@googlemail.com,
%D      license=Public Domain]

\writestatus{loading}{ConTeXt User Module / Ruby Markup}

\unprotect

%D simple ruby:
%D
%D \starttyping
%D <ruby>
%D   <rb>WWW</rb>
%D   <rt>World Wide Web</rt>
%D </ruby>
%D \stoptyping
%D
%D complex ruby:
%D
%D \starttyping
%D <ruby>
%D   <rbc>
%D     <rb>10</rb>
%D     <rb>31</rb>
%D     <rb>2002</rb>
%D   </rbc>
%D   <rtc>
%D     <rt>Month</rt>
%D     <rt>Day</rt>
%D     <rt>Year</rt>
%D   </rtc>
%D   <rtc>
%D     <rt rbspan="3">Expiration Date</rt>
%D   </rtc>
%D </ruby>
%D \stoptyping

%D Constants

\startinterface all
  \setinterfaceconstant {basestyle} {basestyle}
  \setinterfaceconstant {basecolor} {basecolor}
  \setinterfaceconstant {overhang}  {overhang}
\stopinterface

\startinterface all
  \setinterfacevariable {letter} {letter}
  \setinterfacevariable {end}    {end}
  \setinterfacevariable {inline} {inline}
\stopinterface

%D Namespace

\def\????rb{@@@@rb}

%D Additional registers

\newdimen \!!rubywidth
\newdimen \!!rubyleftmargin
\newdimen \!!rubyrightmargin
\newsignal\!!rubysignal
\newcount \!!rubycount
\newtoks  \!!rubybase
\newtoks  \!!rubytext

%D Helpers

\newif\ifideograph

\long\def\doifelseideograph#1%
  {\global\ideographtrue
   \handletokens#1\with\checkideograph
   \ifideograph
     \expandafter\firstoftwoarguments
   \else
     \expandafter\secondoftwoarguments
   \fi}

\def\doifinrangeelse#1#2#3%
  {\unless\ifnum#1<#2
     \unless\ifnum#1>#3
       \expandafter\expandafter\expandafter\firstoftwoarguments
     \else
       \expandafter\expandafter\expandafter\secondoftwoarguments
     \fi
   \else
     \expandafter\secondoftwoarguments
   \fi}

\def\checkideograph#1%
  {\doifinrangeelse{`#1}{"3040}{"309F}\donothing
     {\doifinrangeelse{`#1}{"30A0}{"30FF}\donothing
        {\doifinrangeelse{`#1}{"31F0}{"31FF}\donothing
           {\doifinrangeelse{`#1}{"3400}{"4DFF}\donothing
              {\doifinrangeelse{`#1}{"4E00}{"9FFF}\donothing
                 {\doifinrangeelse{`#1}{"AC00}{"D7A3}\donothing
                    {\doifinrangeelse{`#1}{"F900}{"FAFF}\donothing
                       {\doifinrangeelse{`#1}{"FF00}{"FFEF}\donothing
                          {\doifinrangeelse{`#1}{"20000}{"2A6DF}\donothing
                             {\doifinrangeelse{`#1}{"2F800}{"2FA1F}\donothing
                                {\ideographfalse}}}}}}}}}}}

%D \macros
%D   {setupruby}

\def\setupruby
  {\dodoubleargument\getparameters[\????rb]}

\def\rubyparameter#1{\csname\????rb#1\endcsname}

%D \macros
%D   {pdfactualtext}

\ifx\pdfactualtext\undefined \let\pdfactualtext\secondoftwoarguments \fi

%D \macros
%D   {bRUBY,eRUBY,bRB,eRB,bRT,eRT}

\def\bRUBY
  {\dosingleempty\dobRUBY}

\def\dobRUBY[#1]%
  {\begingroup
   \iffirstargument
     \setupruby[#1]%
   \fi
   \scratchdimen\lastskip
   \ifdim\scratchdimen=\!!rubysignal\else\global\!!rubywidth\!!zeropoint\fi
   \global\advance\!!rubycount\plusone
   \xypos{rubyposition:\number\!!rubycount}%
   \doifmodeelse\v!first
     {\edef\rubyposition{\the\onepoint}}%
     {\edef\rubyposition{\the\dimexpr\MPx{rubyposition:\number\!!rubycount}-\MPx{text:\the\realpageno}\relax}}}

\def\eRUBY
  {\setbox\scratchboxone\hbox{\doattributes\????rb\c!basestyle\c!basecolor{\the\!!rubybase}}%
   \setbox\scratchboxtwo\hbox{\doattributes\????rb\c!textstyle\c!textcolor{\the\!!rubytext}}%
   \scratchdimenone\wd\scratchboxone
   \scratchdimentwo\wd\scratchboxtwo
   %\scratchdimenthree\ifdim\scratchdimenone<\scratchdimentwo\space\scratchdimenone\else\scratchdimentwo\fi
   \scratchdimenthree\scratchdimenone
   \executeifdefined{\????rb:\c!align   :\rubyparameter\c!align   }{\getvalue{\????rb:\c!align   :\v!auto  }}%
   \executeifdefined{\????rb:\c!position:\rubyparameter\c!position}{\getvalue{\????rb:\c!position:\v!before}}%
   \executeifdefined{\????rb:\c!overhang:\rubyparameter\c!overhang}{\getvalue{\????rb:\c!overhang:\v!auto  }}%
   \hskip\!!rubysignal\relax
   \endgroup}

\def\bRB{\dodoubleempty\dobRB}
\def\bRT{\dodoubleempty\dobRT}

\def\dobRB[#1][#2]#3\eRB{\!!rubybase{#3}}
\def\dobRT[#1][#2]#3\eRT{\!!rubytext{#3}}

%D Alignment

\def\RUBYdistributespace #1{\doifelseideograph{#1}{\processtokens{\hss  }{\hss\hss}{\hss  }{\hss\hss}{#1}}{\hss#1\hss}}
\def\RUBYdistributeletter#1{\doifelseideograph{#1}{\processtokens{\relax}{\hss    }{\relax}{\hss\hss}{#1}}{\hss#1\hss}}

\setvalue{\????rb:\c!align:\v!space}%
  {\!!rubyleftmargin \zeropoint
   \!!rubyrightmargin\zeropoint
   \ifdim\scratchdimenone>\scratchdimentwo
     \setbox\scratchboxone\hbox to \scratchdimenone{\hss\box\scratchboxone\hss}%
     \setbox\scratchboxtwo\hbox to \scratchdimenone{\doattributes\????rb\c!textstyle\c!textcolor{\@EA\RUBYdistributespace\@EA{\the\!!rubytext}}}%
   \else
     \setbox\scratchboxone\hbox to \scratchdimentwo{\doattributes\????rb\c!basestyle\c!basecolor{\@EA\RUBYdistributespace\@EA{\the\!!rubybase}}}%
     \setbox\scratchboxtwo\hbox to \scratchdimentwo{\hss\box\scratchboxtwo\hss}%
   \fi}

\setvalue{\????rb:\c!align:\v!letter}%
  {\!!rubyleftmargin \zeropoint
   \!!rubyrightmargin\zeropoint
   \ifdim\scratchdimenone>\scratchdimentwo
     \setbox\scratchboxone\hbox to \scratchdimenone{\hss\box\scratchboxone\hss}%
     \setbox\scratchboxtwo\hbox to \scratchdimenone{\doattributes\????rb\c!textstyle\c!textcolor{\@EA\RUBYdistributeletter\@EA{\the\!!rubytext}}}%
   \else
     \setbox\scratchboxone\hbox to \scratchdimentwo{\doattributes\????rb\c!basestyle\c!basecolor{\@EA\RUBYdistributeletter\@EA{\the\!!rubybase}}}%
     \setbox\scratchboxtwo\hbox to \scratchdimentwo{\hss\box\scratchboxtwo\hss}%
   \fi}

\setvalue{\????rb:\c!align:\v!auto}% I need special alignments for the begin/end of the line!!!
  {\ifdim\scratchdimenone>\scratchdimentwo
     \getvalue{\????rb:\c!align:\v!space}%
   \else
     \ifdim\rubyposition=\!!zeropoint % begin of the line
       \getvalue{\????rb:\c!align:\v!left}%
     \else\ifdim\rubyposition=\the\dimexpr\textwidth-\scratchdimenthree\relax % end of the line
       \getvalue{\????rb:\c!align:\v!right}%
     \else
       \getvalue{\????rb:\c!align:\v!space}%
     \fi\fi
   \fi}

\setvalue{\????rb:\c!align:\v!left}%
  {\ifdim\scratchdimenone>\scratchdimentwo
     \!!rubyleftmargin \zeropoint
     \!!rubyrightmargin\zeropoint
   \else
     \!!rubyleftmargin \zeropoint
     \!!rubyrightmargin\dimexpr\scratchdimentwo-\scratchdimenone\relax
   \fi
   \setbox\scratchboxone\hbox to \scratchdimenthree{\box\scratchboxone\hss}%
   \setbox\scratchboxtwo\hbox to \scratchdimenthree{\box\scratchboxtwo\hss}}

\setvalue{\????rb:\c!align:\v!start}%
  {\getvalue{\????rb:\c!align:\v!left}}

\setvalue{\????rb:\c!align:\v!center}%
  {\ifdim\scratchdimenone>\scratchdimentwo
     \!!rubyleftmargin \zeropoint
     \!!rubyrightmargin\zeropoint
   \else
     \!!rubyleftmargin \dimexpr(\scratchdimentwo-\scratchdimenone)/2\relax
     \!!rubyrightmargin\dimexpr(\scratchdimentwo-\scratchdimenone)/2\relax
   \fi
   \setbox\scratchboxone\hbox to \scratchdimenthree{\hss\box\scratchboxone\hss}%
   \setbox\scratchboxtwo\hbox to \scratchdimenthree{\hss\box\scratchboxtwo\hss}}

\setvalue{\????rb:\c!align:\v!right}%
  {\ifdim\scratchdimenone>\scratchdimentwo
     \!!rubyleftmargin \zeropoint
     \!!rubyrightmargin\zeropoint
   \else
     \!!rubyleftmargin \dimexpr\scratchdimentwo-\scratchdimenone\relax
     \!!rubyrightmargin\zeropoint
   \fi
   \setbox\scratchboxone\hbox to \scratchdimenthree{\hss\box\scratchboxone}%
   \setbox\scratchboxtwo\hbox to \scratchdimenthree{\hss\box\scratchboxtwo}}

\setvalue{\????rb:\c!align:\v!end}%
  {\getvalue{\v!ruby:\c!align:\v!right}}

\setvalue{\????rb:\c!align:\v!edge}% modify to take care of overlap etc.
  {\ifdim\rubyposition=\zeropoint
     \getvalue{\????rb:\c!align:\v!left}%
   \else\ifdim\rubyposition=\the\dimexpr\textwidth-\scratchdimenthree\relax
     \getvalue{\????rb:\c!align:\v!right}%
   \else
     \getvalue{\????rb:\c!align:\v!center}%
   \fi\fi}

%D Positioning

\setvalue{\????rb:\c!position:\v!before}%
  {\setbox\scratchboxthree\vbox
     {\offinterlineskip
      \box\scratchboxtwo
      \rubyparameter\c!inbetween
      \box\scratchboxone}}

\setvalue{\????rb:\c!position:\v!after}%
  {\setbox\scratchboxthree\vtop
     {\offinterlineskip
      \box\scratchboxone
      \rubyparameter\c!inbetween
      \box\scratchboxtwo}}

\setvalue{\????rb:\c!position:\v!inline}% pure text to allow line breaks in the text
  {\setbox\scratchboxthree\box\voidbox
   \!!rubyleftmargin \zeropoint
   \!!rubyrightmargin\zeropoint
   \the\!!rubybase
   \rubyparameter\c!separator
   \rubyparameter\c!lefttext\the\!!rubytext\rubyparameter\c!righttext}

%D Overhang

\setvalue{\????rb:\c!overhang:\v!auto}%
  {\ifdim\!!rubywidth>\!!zeropoint
     \kern\dimexpr\!!rubyleftmargin+\!!rubywidth\relax
   \fi
   \box\scratchboxthree
   \global\!!rubywidth\!!rubyrightmargin}

\setvalue{\????rb:\c!overhang:\v!start}%
  {\box\scratchboxthree\kern\!!rubyrightmargin
   \global\!!rubywidth\!!rubyrightmargin}

\setvalue{\????rb:\c!overhang:\v!end}%
  {\ifdim\!!rubywidth>\!!zeropoint
     \kern\dimexpr\!!rubyleftmargin+\!!rubywidth\relax
   \else
     \kern\!!rubyleftmargin
   \fi
   \box\scratchboxthree
   \global\!!rubywidth\!!zeropoint}

\setvalue{\????rb:\c!overhang:\v!none}%
  {\kern\!!rubyleftmargin\box\scratchboxthree\kern\!!rubyrightmargin
   \global\!!rubywidth\!!zeropoint}

%D \macros
%D   {ruby}

\def\ruby
  {\dosingleempty\doruby}

\def\doruby[#1]#2#3%
  {\dobRUBY[#1]\bRB#2\eRB\bRT#3\eRT\eRUBY}

%D Default values

\setupruby
  [\c!position=\v!before, % before|after|inline
   \c!align=\v!auto,      % auto|start|left|center|end|right|distribute-letter|distribute-space|line-edge
   \c!overhang=\v!auto,   % auto|start|end|none
   \c!separator={ },
   \c!lefttext=(,
   \c!righttext=),
   \c!inbetween={\blank[\v!small]},
   \c!textstyle=\txx]

\protect \endinput

[-- Attachment #4: chord.tex --]
[-- Type: application/octet-stream, Size: 490 bytes --]

\usemodule[ruby]

%\define[1]\chord{\bRUBY[position=after,align=left]\bRB\eRB\bRT#1\eRT\eRUBY}
\define[1]\chord{\dontleavehmode\ruby[position=after,align=left,inbetween={\blank[medium]}]{}{#1}}

\starttext

\startlines

\chord{E}Cvet dišeč z \chord{H7}jutrom se od\chord{cis}pre,

\chord{A}sonce od\chord{E}pira o\chord{H}či.

\chord{E}Polje z vetrom v \chord{H7}plesu ziblje \chord{cis}se.

Gos\chord{E}pod, pov\chord{H}sod vidim \chord{E}Te.

\stoplines

\stoptext

[-- Attachment #5: README --]
[-- Type: application/octet-stream, Size: 840 bytes --]

Modulename : t-ruby
Author     : Wolfgang Schuster
License    : Public Domain


Description
-----------

The 'ruby' module allows users to write ruby annotations in ConTeXt.


Usage
-----

The module is loaded with the command:

  \usemodule[ruby]

Ruby text can be set with the command:

  \ruby{base text}{ruy text}

The layout of the base and ruby text could be changed with:

  \setupruby
    [basestyle=...,
     basecolor=...,
     textstyle=...,
     textcolor=...]

Whether ruby text overlaps with the surrounding text or not can be configured with:

  \setupruby
    [overlap=yes|no] % default: yes

The last option is the distance between the ruby and the base text:

  \setupruby
    [inbetween=...] % default: \blank[small]

All of these parameters can also be changed for a single ruby command:

  \ruby[..,..=..,..]{...}{...}

[-- Attachment #6: Type: text/plain, Size: 601 bytes --]


Am 12.01.2010 um 18:24 schrieb Aditya Mahajan:

> On Tue, 12 Jan 2010, Vyatcheslav Yatskovsky wrote:
> 
>> Thanks for answers, friends!
>> 
>> I don't have ruby installed, so I try Mojca solution.>
> 
> Wolfgang's module is for writing Ruby annotations (http://www.w3.org/TR/ruby), it is not require Ruby programming language.


I attached my last version of the module with two test files to show
Vyatcheslav what Mojca meant with a optimized version of her code,
the module provides the same as she showed by hidden from the user
and customizable with different keys.

Wolfgang


[-- Attachment #7: Type: text/plain, Size: 486 bytes --]

___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

      reply	other threads:[~2010-01-12 22:02 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.0.1263294002.32702.ntg-context@ntg.nl>
2010-01-12 17:07 ` Vyatcheslav Yatskovsky
2010-01-12 17:24   ` Aditya Mahajan
2010-01-12 22:02     ` Wolfgang Schuster [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=D822561F-1064-4907-9CDD-30187A53E741@googlemail.com \
    --to=schuster.wolfgang@googlemail.com \
    --cc=ntg-context@ntg.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).