ТЛ;ДР; Как определить наличие математических символов в строке?
Я собираю много текстовых данных от других, через такие источники, как формы Google или непосредственно в электронных таблицах. Часто люди, вводящие данные, копируют текст откуда-то еще, например, с веб-страницы или PDF-файла, и вместе с текстом присутствуют математические символы.
Пример строки, в которой $\pi$ копируется как символ. "and π-d orbital"
R прекрасно читает это, а в коде уценки он даже прекрасно печатает/отображает это в формате HTML (см. пример). Однако мне нужно преобразовать это текстовое содержимое в PDF.
Что конечно Латексу не нравится и выдает следующую ошибку
! LaTeX Error: Unicode character μ (U+03BC)
not set up for use with LaTeX.
Я хотел бы написать код типа gsub
/str_detect
, чтобы найти любые специальные символы, чтобы я мог заменить их правильным латексным символом: $\pi$
.
Я попробовал следующий код для обнаружения небуквенных символов, но это не сработало (возвратил FALSE
, что означает, что символы не обнаружены).
stringr::str_detect("and π-d orbital", "[a-zA-Z]", negate = TRUE)
Предложения? Есть ли решение LaTeX?
Установка negate = TRUE
по сути означает вопрос: «Не содержит ли эта строка символов "[a-zA-Z]"
?». Это вопрос, отличный от того, что вы хотите: «Включает ли эта строка какие-либо символы, которых нет в "[a-zA-Z]"
?». Чтобы задать этот вопрос, используйте ^
внутри []
. Обратите внимание, что вы также захотите включить пробелы, "-"
и любые другие «приемлемые» символы.
stringr::str_detect("and π-d orbital", "[^\\s\\-a-zA-Z]")
# TRUE
Вот почему я отмечаю, что ОП необходимо будет добавить любые другие символы, которые они считают приемлемыми, например знаки препинания.
Почему? Математический символ обычно представляет собой греческие буквы. Это будет намного ближе. например gsub("\\P{Greek}", "", "and π-d orbital", perl = TRUE)
следует удалить все, что не греческое
Это хороший подход, и я не знал, что таким образом можно идентифицировать греческие символы, поэтому спасибо, что научили меня. Почему бы вам не опубликовать это в качестве ответа?
Ну все равно не соответствует требованиям вопроса. Я могу перевести только в $p$, а не в $\pi$, что не является решением.
@Onyambu --- ооооо... это. Это может быть другое решение/обходной путь. Если я могу отменить это предложение, чтобы превратить весь греческий в отсутствующий. И ДА, я не знал, что можно искать по греческому слову!
Отрицание решения @Onyambu позволило мне «удалить» греческие буквы, что дает мне хорошее альтернативное решение, которое я могу реализовать. Мне не нужно искать/заменять греческий язык, если я могу показать исходному отправителю, где находятся его ошибки (заставьте его исправить!)
Я собираюсь отметить это как ответ, но также спасибо @zephryl за то, что научили меня отрицать регулярное выражение, что в конечном итоге привело меня к тому же месту.
вы можете использовать словарь со всеми греческими буквами и их названиями, чтобы заменить их соответствующим образом.
Перепишите греческий словарь в LaTeX, например что из неофициального справочного руководства LaTeX2e.
> library(rvest)
> l <- 'https://latexref.xyz/Greek-letters.html'
> s <- html_table(read_html(l))[[1]][1:2] |> sapply(strsplit, ', ') |>
+ apply(1, data.frame) |> Reduce(f=rbind)
> x <- "and π-d orbital"
> stringi::stri_replace_all_fixed(x, s$Symbol, s$Command, vectorize_all=FALSE)
[1] "and \\pi-d orbital"
Если это не только греческий, можно включить и другие. Возможно, вам придется удалить обратную косую черту, в зависимости от ваших обстоятельств.
Этого не хватает из-за того, что знаки препинания не являются математическими символами, но они будут отображаться как истинные.