4

I'm new to ConTeXt, and I feel very excited about its capabilities. But as soon as I've tried to make a handsome document in Russian, I've learned that ConTeXt doesn't seem to provide Babel-shorthands as (Lua/Xe/pdf)LaTeX have used to:

% pdfLaTeX code
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\begin{document}
"--* Прямая речь "--- "<после "`тире"' неразрывный пробел">.    
\end{document}

The code above contains a direct speech dash, a Cyrillic em-dash and two types of quote marks, and produces: pdfLaTeX code

Unsurprisingly, ConTeXt recognizes none of those shorthands:

% ConTeXt code
\mainlanguage[russian]
\setupbodyfont[libertine]
\starttext
"--* Прямая речь "--- "<после "`тире"' неразрывный пробел">.
\stoptext

ConTeXt code

While quote marks can be substituted with corresponding font characters (« » „ ‟) , the specific Cyrillic dash "--- (which is shorter than em-dash, and has fixed spaces around it with non-breaking one at left side) can't be, and I've yet to figure out a way of typing or implementing it.

Is there a way of enabling Babel shorthands or implementing their functionality in ConTeXt?

(Thanks and Happy New Year!)

UPD1: I've found that a nicer way to define \cyrdash symbol would be something like

\define\cyrdash{\scale[sx=0.9]{---}} % produces a smoother dash

Also here's how "--- is defined in Babel:

\def\@Acdash{\ifdim\lastskip>\z@\unskip\nobreak\hskip.2em\fi
  \cyrdash\hskip.2em\ignorespaces}%

UPD2: I was able to recreate the desired behavior with translate module:

\define\cyrdash{\scale[sx=0.80]{---}}  % Cyrillic dash sign

\usemodule[translate]
\translateinput["---][\unskip\thinspace\cyrdash\thinspace\ignorespaces] % Cyrillic text em-dash
\translateinput["--*][\leavevmode\cyrdash\hskip.35em] % Cyrillic direct speech dash

\mainlanguage[russian]
\setupbodyfont[dejavu]
\starttext\enableinputtranslation 
"--* Прямая речь "--- \quotation{после \quote{тире} неразрывный пробел}.    
\stoptext

ConTeXt code with translate module

(Many thanks to @Aditya for suggestions)

0

1 Answer 1

6

For the quotes, you can either use:

\quotation{после \quote{тире} неразрывный пробел}.    

or (as you note) directly type:

«после „тире” неразрывный пробел».

Here is a minimal example:

\mainlanguage[ru]
\setupbodyfont[dejavu]
\starttext
\quotation{после \quote{тире} неразрывный пробел}.    

«после „тире” неразрывный пробел».
\stoptext

which gives:

enter image description here

For the em-dashes, you can use compound words: |<| and |=|. By default, they do not leave any space, but that can be modified as follows:

\define\cyrdash{\hbox to.8em{--\hss--}}
\unprotect
\setuplanguage
  [\s!ru]
  [
    \c!midsentence=\cyrdash,
    \c!leftsentence=\cyrdash,
    \c!rightsentence=\cyrdash,
  ]
\def\beginofsubsentencespacing{\thinspace}
\def\endofsubsentencespacing{\thinspace}

% Redefine |=|
\definetextmodediscretionary =
  {\endofsubsentencespacing\prewordbreak\midsentence\beginofsubsentencespacing\prewordbreak} 
\protect

\mainlanguage[ru]
\setupbodyfont[dejavu]

\starttext
|=|Прямая речь|<|\quotation{после \quote{тире} неразрывный пробел}.    
\stoptext

which gives

enter image description here

EDIT: Depending on the exact definitions that you want, you can redefine |<| and |=| (or even create new ones instead of < and =). For example:

\define\cyrdash{\dontleavehmode\scale[sx=0.80]{---}}  
% Redefine |=|
\definetextmodediscretionary =
  {\leavevmode\cyrdash\hskip.35em}

% Redefine |<|
\definetextmodediscretionary <
  {\removeunwantedspaces\thinspace\cyrdash\thinspace\ignorespaces}

Note that \thinspace is defined (roughly) as: \kern<amount>, so it is unbreakable. If you want breakable space, use \hskip<amount>.

8
  • As the example shows, "--- typesets a shorter dash than the em-dash, with thin (non-breaking) spaces on either side; with "--* the same dash is used, but only spaced at the right.
    – egreg
    Commented Jan 1, 2016 at 23:12
  • @egreg: See my updated answer. I copied the definition of \cyrdash from another answer; I am guessing that the spaces should be \thinspace; if not, that can be changed appropriately.
    – Aditya
    Commented Jan 2, 2016 at 0:10
  • @Aditya thank you very much, great take on quotes, but this modified compound word thing still doesn't leave the space? And also I was a bit wrong: "--- has a fixed non-breaking space at its left and breakable fixed space (of the same width) at its right. Could you modify the code accordingly, please?
    – The_Keeper
    Commented Jan 2, 2016 at 0:19
  • @Aditya: I've figured that |=| does seem to behave like "---. Did you mean using |<| as "--* and |=| as "---?
    – The_Keeper
    Commented Jan 2, 2016 at 0:35
  • @Aditya: also |=| doesn't seem to suppress source whitespaces (which might be inconvenient). I've updated the question with implementation of this dash in babel, I hope that might be helpful.
    – The_Keeper
    Commented Jan 2, 2016 at 1:03

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .