Skip to content

Commit

Permalink
Rationalized behavior of --no-tex-ligatures and --smart.
Browse files Browse the repository at this point in the history
This change makes `--no-tex-ligatures` affect the LaTeX reader
as well as the LaTeX and ConTeXt writers.  If it is used,
the LaTeX reader will parse characters `` ` ``, `'`, and `-`
literally, rather than parsing ligatures for quotation marks
and dashes.  And the LaTeX writer will print unicode quotation
mark and dash characters literally, rather than converting
them to the standard ASCII ligatures.

Note that `--smart` has no affect on the LaTeX reader.

`--smart` is still the default for all input formats when
LaTeX or ConTeXt is the output format, *unless* `--no-tex-ligatures`
is used.

Some examples to illustrate the logic:

```
% echo "'hi'" | pandoc -t latex
`hi'
% echo "'hi'" | pandoc -t latex --no-tex-ligatures
'hi'
% echo "'hi'" | pandoc -t latex --no-tex-ligatures --smart
‘hi’
% echo "'hi'" | pandoc -f latex --no-tex-ligatures
<p>'hi'</p>
% echo "'hi'" | pandoc -f latex
<p>’hi’</p>
```

Closes #2541.
  • Loading branch information
jgm committed Nov 20, 2015
1 parent da4103b commit ed1173a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 21 deletions.
24 changes: 14 additions & 10 deletions README
Expand Up @@ -374,7 +374,7 @@ Reader options
`...` to ellipses. Nonbreaking spaces are inserted after certain
abbreviations, such as "Mr." (Note: This option is selected automatically
when the output format is `latex` or `context`, unless `--no-tex-ligatures`
is used.)
is used. It has no effect for `latex` input.)

`--old-dashes`

Expand Down Expand Up @@ -651,15 +651,19 @@ Options affecting specific writers

`--no-tex-ligatures`

: Do not convert quotation marks, apostrophes, and dashes to
the TeX ligatures when writing LaTeX or ConTeXt. Instead, just
use literal unicode characters. This is needed for using advanced
OpenType features with `xelatex` and `lualatex`. Note: normally
`--smart` is selected automatically for LaTeX and ConTeXt
output, but it must be specified explicitly if `--no-tex-ligatures`
is selected. If you use literal curly quotes, dashes, and ellipses
in your source, then you may want to use `--no-tex-ligatures`
without `--smart`.
: Do not use the TeX ligatures for quotation marks, apostrophes,
and dashes (`` `...' ``, ` ``..'' `, `--`, `---`) when
writing or reading LaTeX or ConTeXt. In reading LaTeX,
parse the characters `` ` ``, `'`, and `-` literally, rather
than parsing ligatures for quotation marks and dashes. In
writing LaTeX or ConTeXt, print unicode quotation mark and
dash characters literally, rather than converting them to
the standard ASCII TeX ligatures. Note: normally `--smart`
is selected automatically for LaTeX and ConTeXt output, but
it must be specified explicitly if `--no-tex-ligatures` is
selected. If you use literal curly quotes, dashes, and
ellipses in your source, then you may want to use
`--no-tex-ligatures` without `--smart`.

`--listings`

Expand Down
9 changes: 7 additions & 2 deletions pandoc.hs
Expand Up @@ -1176,6 +1176,9 @@ main = do
"beamer" `isPrefixOf` writerName'
let conTeXtOutput = "context" `isPrefixOf` writerName'

let laTeXInput = "latex" `isPrefixOf` readerName' ||
"beamer" `isPrefixOf` readerName'

writer <- if ".lua" `isSuffixOf` writerName'
-- note: use non-lowercased version writerName
then return $ IOStringWriter $ writeCustom writerName
Expand Down Expand Up @@ -1257,8 +1260,10 @@ main = do
uriFragment = "" }
_ -> Nothing

let readerOpts = def{ readerSmart = smart || (texLigatures &&
(laTeXOutput || conTeXtOutput))
let readerOpts = def{ readerSmart = if laTeXInput
then texLigatures
else smart || (texLigatures &&
(laTeXOutput || conTeXtOutput))
, readerStandalone = standalone'
, readerParseRaw = parseRaw
, readerColumns = columns
Expand Down
24 changes: 15 additions & 9 deletions src/Text/Pandoc/Readers/LaTeX.hs
Expand Up @@ -169,17 +169,23 @@ quoted' f starter ender = do
try ((f . mconcat) <$> manyTill inline ender) <|> lit startchs

doubleQuote :: LP Inlines
doubleQuote =
quoted' doubleQuoted (try $ string "``") (void $ try $ string "''")
<|> quoted' doubleQuoted (string "") (void $ char '')
-- the following is used by babel for localized quotes:
<|> quoted' doubleQuoted (try $ string "\"`") (void $ try $ string "\"'")
<|> quoted' doubleQuoted (string "\"") (void $ char '"')
doubleQuote = do
smart <- getOption readerSmart
if smart
then quoted' doubleQuoted (try $ string "``") (void $ try $ string "''")
<|> quoted' doubleQuoted (string "") (void $ char '')
-- the following is used by babel for localized quotes:
<|> quoted' doubleQuoted (try $ string "\"`") (void $ try $ string "\"'")
<|> quoted' doubleQuoted (string "\"") (void $ char '"')
else str <$> many1 (oneOf "`'“”\"")

singleQuote :: LP Inlines
singleQuote =
quoted' singleQuoted (string "`") (try $ char '\'' >> notFollowedBy letter)
<|> quoted' singleQuoted (string "") (try $ char '' >> notFollowedBy letter)
singleQuote = do
smart <- getOption readerSmart
if smart
then quoted' singleQuoted (string "`") (try $ char '\'' >> notFollowedBy letter)
<|> quoted' singleQuoted (string "") (try $ char '' >> notFollowedBy letter)
else str <$> many1 (oneOf "`\'‘’")

inline :: LP Inlines
inline = (mempty <$ comment)
Expand Down

0 comments on commit ed1173a

Please sign in to comment.