\u в JavaScript String.raw`template literal`

Как я могу избежать интерпретации \u как управляющей последовательности символов?

В моем проекте JavaScript мне нужен строковый литерал некоторых начальных команд LaTeX. Раньше я экранировал каждую обратную косую черту (\\), но недавно я обнаружил необработанные строки в JavaScript. Было бы здорово, если бы я мог иметь точный строковый литерал в своем исходном коде. К сожалению, теперь есть проблема в \usepackage{indentfirst}. \u интерпретируется как escape-последовательность символов, что, конечно, не то, что я имею в виду. Есть ли способ избежать такого поведения, или это просто не место для String.raw?

Сокращенный код:

var title="title", author="author";

console.log(String.raw`
\documentclass{book}

\title{${title}}
\author{${author}}
\date{}

\usepackage{indentfirst}

\begin{document}
\maketitle{}
\tableofcontents{}
`);

Я заставил это работать, заменив оскорбительную строку на `+"\\usepackage{indentfirst}"+String.raw`, но, конечно, это не очень понятно.


person seth10    schedule 03.09.2016    source источник
comment
Хм, ожидается, что String.raw вернет "\\u…". Вы получаете ошибку или просто неправильный результат? Какую реализацию ES6 вы используете?   -  person Bergi    schedule 03.09.2016
comment
@Bergi - У меня было то же предложение, но похоже, что новый побег юникода es6, который позволяет вам делать такие вещи, как console.log('\u{2622}'), вызовет ошибку Неожиданный токен внутри строк шаблона es6. Так что проблематично только \u, а не \n или \r и так далее.   -  person DavidDomain    schedule 03.09.2016
comment
@DavidDomain Использование его в качестве строки может вызвать выброс, но использование его с тегом String.raw не должно.   -  person Bergi    schedule 03.09.2016
comment
@Bergi Только что попробовал, это работает console.log(String.raw`Not a newline: \n`), это не работает console.log(String.raw`Unicode escape: \u`).   -  person DavidDomain    schedule 03.09.2016
comment
@DavidDomain В каком браузере? Я надеюсь, что это ошибка, а если нет, то, вероятно, это должно быть исправлено в спецификации.   -  person Bergi    schedule 03.09.2016
comment
@Берги - Хром. Думаю, вы правы, должно быть, ошибка или отставание в реализации. Забавно, что транспиляция с помощью babel также выдает ошибку.   -  person DavidDomain    schedule 03.09.2016
comment
Это определенно была проблема с браузерами по состоянию на июль 2017 года (когда я последний раз проверял), но с тех пор после этого предложения теперь String.raw литералы могут содержать \u, так что больше нет проблем. Единственное, что теперь считается особенным, это ${   -  person ShreevatsaR    schedule 14.02.2018


Ответы (1)


Вы можете воспользоваться синтаксисом \u, заменив строку на \u005Cusepackage{indentfirst} или даже просто на \x5Cusepackage{indentfirst}.

5C соответствует \.

Другим вариантом может быть использование знака доллара и фигурных скобок для выражений. ${'\\'}usepackage{indentfirst}

person seth10    schedule 03.09.2016