LaTeX 문서에 대괄호 용어가 올바른지 자동으로 확인할 수 있는 도구를 찾고 있습니다.
그러한 도구를 작성하는 것은 매우 쉽지만 작성하기 전에 이미 존재하는지 알고 싶습니다.
스크립트에서 사용할 수 있으려면 명령줄 도구나 셸 코드여야 합니다. GUI 도구는 나에게 도움이 되지 않습니다. 괄호를 확인해야 합니다 () {} [] <>
.
나는 문서를 대괄호 표현식으로 취급합니다. 대괄호가 아닌 모든 문자는 중요하지 않습니다. 대괄호 항 T가 한 가지 유형의 대괄호만 가지려면 다음 조건을 충족해야 합니다.
- T의 왼쪽 및 오른쪽 대괄호 개수는 동일해야 합니다.
- T의 접두사는 왼쪽 괄호보다 오른쪽 괄호를 더 많이 포함할 수 없습니다.
여러 유형의 괄호(괄호 집합 B)가 있는 경우 T는 모든 β ∈ B에 대해 위 조건을 충족해야 하며, 쌍을 이루는 괄호로 파생된 T의 모든 부분 문자열도 위 조건을 충족해야 합니다. T의 하위 문자열(t_1, ..., t_s)은 β 유형의 쌍 괄호로 도입되는 것으로 간주됩니다. 단, (β_opening, t_1, ..., t_s, β_opening)은 T의 하위 문자열입니다.
답변1
나는 해당 체커의 언어에 따라 관련 없는 다른 구문 오류로 사용자를 괴롭히지 않고 괄호의 올바른 쌍을 검사하는 프로그램을 모릅니다.
말씀하신 대로 이와 같은 도구를 작성하는 것은 쉽습니다. 따라서 해당 작업을 수행할 수 있는 작은 스크립트는 다음과 같습니다.
#!/bin/sh
# If a file is given as 1st parameter, use it, else use stdin
[ "$#" -gt 0 ] && exec < "$1"
# A correct input file should result in an empty string
tr -d -c '{}[]()<>' |
sed '
# Eliminate adjacent bracket pairs one by one
:loop
s/\[\]\|()\|{}\|<>//g
t loop
' |
if grep -q .; then
echo "ERROR: unpaired brackets!"
else
echo "OK: all brackets are paired."
fi
sed
구현이 (비표준) 대체 연산자를 지원하지 않는 경우 이 명령을 4로 바꿀 \|
수 있습니다 .s
s/\[\]//g
s/{}//g
s/()//g
s/<>//g
위 명령은 tr
표준이지만 일부(SysV 기반 명령)는 이러한 이스케이프되지 않은 [
범위에 대해 불평합니다. 이를 사용하면 ( ) 이스케이프를 [
사용할 수 있지만 POSIX에 따라 지정되지 않게 되며 백스페이스 문자를 제거하는 방법이 있습니다. 이식성을 위해 ASCII 기반 시스템에서는 .\
tr -cd '{}()<>\[]'
tr -cd '{}()<>\133\135'
답변2
grep
PCRE 지원과 함께 GNU를 사용하면 다음을 수행할 수 있습니다.
find . -size +0 -type f -exec \
grep -zLP '\A((?:[^][<>{()}]++|<(?1)>|\{(?1)\}|\[(?1)\]|\((?1)\))*+)\z' {} +
그러한 파일을 찾으십시오(NUL 바이트가 포함되어 있지 않고 각 파일이 전체 메모리에 들어갈 만큼 작다고 가정).
또는 직접 호출합니다 perl
(NUL 바이트가 있는 파일은 허용됨).
find . -size +0 -type f -exec perl -l -0777 -ne 'print $ARGV unless
/^((?:[^][<>{()}]++|<(?1)>|\{(?1)\}|\[(?1)\]|\((?1)\))*)$/' {} +
일부 Perl/PCRE 특정 연산자:
\A
\z
주제의 시작과 끝에서 각각 일치합니다 .^
and$
(또는 옵션 포함 )와 비슷-x
하지만 제목이 여러 줄인 경우 모호함이 없습니다(일부 GNU 버전에서 필요함grep
).++
AND 연산자의 비역추적 버전입니다*+
. 이는 정규식 엔진이 일치 항목을 찾을 수 없다는 것을 알 때 일치 항목을 찾기 위해 너무 열심히 노력하지 않도록 도와줍니다.+
*
(?1)
해당 캡처 그룹의 정규식을 참조합니다. 이는 재귀적인 정규 표현식을 허용합니다.(?:...)
, 와 동일(...)
하지만 그룹화에만 사용됩니다(캡처하지 않음...)
*.tex
<
TeX에서 /가 >
비교 연산자로 사용되고 이러한 문자 중 일부가 주석에서 일치하지 않거나 이스케이프된 것으로 발견되었기 때문에 내 시스템에서 많은 비율의 파일을 찾았습니다 .