TeX 기반 전자 채점 소프트웨어 제작기
요약
LaTeX 기반 답안지 구성 패키지 KKran과 이를 활용한 전자 채점 소프트웨어 Scoring64 제작 과정을 소개합니다. 이 시스템은 LaTeX 커맨드만으로 답안지를 만들고, 스캔된 답안을 인식하여 정오 판별 및 점수 계산까지 자동화하는 것을 목표로 합니다.
핵심 포인트
- KKran: LaTeX 커맨드로 답안지 구성이 가능한 패키지입니다.
- Scoring64: KKran 기반 답안지를 생성하고 채점까지 처리하는 소프트웨어입니다.
- 답안 인식의 어려움 극복을 위해 페이지와 사각형 범위를 할당합니다.
- 개발 과정에서 고려한 기술적 난제와 비하인드 스토리를 공유합니다.
LaTeX로 답안지를 만들 수 있게 되면, 다음으로 필요한 것은 '그 답안을 채점하는 과정까지 한 번에 진행할 수 있는' 시스템이었습니다.
답안지 구성 패키지 KKran 을 기반으로, 학원용 전자 채점 소프트웨어 Scoring64 를 제작했습니다. Windows와 Mac에서 작동하며, 마크시트(mark sheet) 읽기 및 정오 판별/점수 계산은 기간 제한 없이 무료입니다. 답안지 생성이나 서술형 채점 등 유료 기능에 대해서는 최초 10일간의 체험판을 제공합니다.
사실 모든 기능을 무료로 제공하고 싶었지만... 상당한 시간과 약간의 필요 경비가 소요되었기 때문에, 전체 사용은 유료라는 형태로 진행하게 되었습니다. 다른 전자 채점 시스템을 제공하는 회사들의 상황도 고려하여, 가격 책정은 시장 평균에 가깝게 결정했습니다. 양해 부탁드립니다.
출발점이 된 KKran은 LaTeX 커맨드만으로 답안지를 구성할 수 있는 패키지입니다. 다음 답안지는 Scoring64를 사용하지 않고, KKran과 LuaLaTeX만을 사용하여 구성했습니다. 마크식(mark sheet), 단답형(short answer), 글자 수 지정, 서술형 등 다양한 유형의 칸을 커맨드로 배열했습니다.
단답형 부분의 소스 코드는 다음과 같은 방식으로 작성됩니다. 칸의 폭과 높이를 mm 단위로 지정하고, \GoDown 으로 다음 줄로 넘어갑니다.
\KKran[.6pt]{%
\대문번호[0]{27}[]%
\SetShoumon{0}\소문번호[8]{9}\소문칸{70}{9}%
...
Scoring64는 이 KKran으로 만든 답안지를 화면에서 생성하고, 그대로 채점까지 진행할 수 있도록 하는 소프트웨어입니다.
이 글에서는 답안지 구성부터 전자 채점까지 확장하는 과정에서 고려했던 점들과 실제 조작 화면을 소개합니다.
현재의 시작 화면은 다음과 같습니다. 우선, 답안지를 만들고 답안을 반환(return)하는 것까지 하나의 소프트웨어로 처리하도록 했습니다.
화면을 보면 전체적으로 다음 4가지 단계가 있습니다. 답안지 생성 → 답안 입력 → 채점 → 반환용 출력입니다.
사실 이 소프트웨어의 아이디어 자체는 이미 상당히 전부터 철녹회 내부에서 사용되던 것입니다. 실제로 제가 착상을 얻은 것은 TeXConf2025에서 와타나베(渡辺) 님의 슬라이드였습니다.
당시 시간이 남아돌았던 저는, 이것을 어떻게든 출시하여 일반 사용자용 소프트웨어로 판매하려는 포부를 가지고 개발을 시도했지만, 여러 가지 장애물이 있었습니다.
저는 오랫동안 제가 좋아하는 철녹회 특유의 느낌을 유지하는 조판 연구에 매진해 왔는데, 이 소프트웨어 개발은 그 집대성이라고 할 수 있으며, 마침내 완성하게 되어 매우 기쁩니다.
자, 그럼 아주 조금이지만, 개발 방법과 비하인드 스토리를 엿보시길 바랍니다.
KKran은 Lua와 TikZ를 사용하여 시험 답안지를 구성하는 LaTeX 패키지입니다. 서술용 프레임이나 마크식 답안지 칸 등을 매우 단순한 커맨드로 배치할 수 있습니다. 즉, 답안지 자체는 LaTeX만으로 상당히 간편하게 만들 수 있게 된 것입니다.
하지만, 답안지를 만드는 것과 회수된 답안에서 그 칸만을 잘라내는 것은 별개의 문제입니다. 원본 PDF에서는 깔끔하게 배열되어 있던 프레임도, 한번 인쇄하여 사람이 작성하고 스캔해서 돌아오면 같은 위치에 그대로 놓여있다고 보장할 수 없습니다.
종이가 약간 기울어져 있거나 여백 처리 방식이 다르기만 해도 잘라내는 범위가 틀어집니다. 칸의 위치를 기준으로 삼고 싶은데, 그 칸에는 손글씨나 풀이 과정이 겹쳐져 있을 수 있습니다.
KKran 기반 용지(用紙)의 경우, 레이아웃 작업이 완료된 PDF 상에서 위치를 추출하여 답안 칸별로 페이지와 사각형 범위를 할당합니다. TeX 측에서 지정한 너비나 높이만으로는 개행이나 여백을 포함하여 최종적으로 어디에 배치되었는지까지 알 수 없기 때문입니다.
범위가 결정된 후의 잘라낼 부분만이라면 생각은 간단합니다. 설명용으로 축소하면 다음과 같습니다.
x, y, w, h = (region[k] for k in ("x", "y", "width", "height"))
box = tuple(round(v * scale) for v in (x, y, x + w, y + h))
answer_image = aligned_page.crop(box)
여기서 region은 PDF 상의 답안 칸 범위이며, scale은 PDF 좌표를 이미지 픽셀로 환산하는 배율입니다. aligned_page는 위치 맞춤이 완료된 답안 이미지로서, 여기서는 그 처리를 생략했습니다. 잘라낸 이미지에는 문항과의 대응(対応)도 부여하여 채점 측에서 다룰 수 있도록 합니다.
예를 들어, 번호나 이름 칸도 용지 안에 있지만, 거기에 점수를 매기고 싶은 것은 아닙니다. 위의 화면에서는 그것들을 '채점하지 않는' 칸으로 분리하고 있습니다. 답안 칸에 대해서는 번호와 종류를 확인하고, 범위가 이상하면 종이(紙面)로 돌아가서 수정합니다.
잘라내는 처리 자체의 자세한 이야기는 생략하지만, 그 결과를 사람이 확인하고 수정할 수 있는 지점까지 하나의 흐름으로 만들었습니다. 자동 처리를 거쳤다는 것만으로 올바른 것으로 취급하지 않고, 채점에 사용할 설정을 확인할 수 있도록 한 것입니다.
잘라내기 확인에서는 답안 칸의 후보들이 목록으로 나타납니다. 번호를 순서대로 다시 매기는 작업도 여기서 할 수 있습니다. 후보에 나오지 않은 칸은 '칸을 수동으로 추가'를 통해 종이 면의 범위를 사각형으로 그려서 추가합니다. 공통 테스트용 마크시트(マークシート) 역시 같은 '채점 설정' 항목에서 확인할 수 있습니다.
또 하나의 장벽은, 사용하는 사람이 TeX를 알고 있다고 할 수 없었다는 점이었습니다. 스스로 사용할 목적이라면 명령어를 작성하여 답안 칸을 배치하고 필요한 설정을 소스에 기록하면 충분합니다. 하지만 일반 사용자용 소프트웨어로 판매하려면, 선생님들에게 먼저 TeX를 익히게 할 수는 없습니다.
예를 들어 '이 문제는 서술형이고, 배점은 5점이며, 답안 칸은 여기'라는 지정을 코드를 작성하지 않고도 할 수 있어야 합니다. TeX를 사용하는 입장에서 보면 짧은 기술로 끝나는 일이라도, 화면으로 만들 때는 어디서 범위를 지정할지, 무엇을 입력해야 하는지, 잘못했을 때 어떻게 고칠지까지 준비해야 합니다. 단순히 명령어의 인수를 입력란으로 대체하는 것만으로는 사용자에게 동일한 지식을 요구하게 됩니다.
예를 들어, 설정명이나 수치를 그대로 나열하면 다음과 같은 화면이 되어버립니다.
※ 이 이미지는 사용하기 불편한 UI를 설명하기 위해 코드로 만들어 작동시킨 재현 목업(mock)입니다. 실제 과거 버전의 화면은 아닙니다.
만든 사람에게는 의미가 통하더라도, 처음 사용하는 사람에게는 어디부터 만져야 할지 알 수 없습니다. 설정할 항목을 늘리는 것과 쓸 수 있는 화면을 만드는 것은 별개의 문제였습니다.
그래서 위치 지정은 종이 면을 보면서 진행하고, 문제의 종류는 선택지에서 고르는 형태로 했습니다. 좌표의 수치만 입력받기보다는, 만지고 있는 답안 칸이 어디에 있는지 아는 편이 설정 오류에도 알아차리기 쉽기 때문입니다.
정답 지정 역시 기호를 코드에 쓰는 대신, 화면의 '아・이・우・에'를 클릭하는 형태로 했습니다. 배점은 그 옆에서 입력합니다. 선생님이 생각하는 '이 문제의 정답은 이이고, 10점'이라는 내용을 그대로 조작(操作)으로 만든 것입니다.
정답과 배점은 '정답・배점 입력' 목록에서 모아서 입력할 수 있습니다. 기호 정답은 '정답을 계속 입력'에서 3142처럼 이어서 타이핑하는 것도 가능하며, 다른 답도 인정하는 문제는 채점 방식을 '단답(별해 있음)'으로 설정합니다. 부분 점수가 필요한 서술형 문제의 경우, 채점 화면에서 숫자 키패드(텐키)로 입력합니다.
뒤쪽에서 필요하게 되는 지정은 소프트웨어 측에서 담당하고, 사용하는 사람에게는 문제와 배점을 설정하도록 했습니다. 이렇게 분리하자 TeX 지식을 전제로 했던 조작을 조금씩 화면으로 할 수 있게 되었습니다.
용지를 만드는 화면은 다음과 같습니다. 종이 면의 빈 곳을 클릭해서 위치를 정하고, '부품 추가'에서 답안 칸・문자・수식・그림 등을 배치해 나갑니다. 부품은 드래그로 움직일 수 있고, 복사하여 붙여넣거나 범위 선택으로 모아서 움직일 수도 있습니다.
최신 버전에서는 이 종이(paper)를 TeX의 조판을 기다리지 않고 현장에서 직접 그릴 수 있도록 했습니다. KKran의 용지는 조판할 때마다 대기 시간이 발생하기 때문에, 만질 때마다 화면이 멈춰서 쓸모가 없어집니다. TeX는 백그라운드에서 비교(照合)와 PDF 출력을 담당하며, 현장 드로잉과 차이가 없는지 확인합니다. TeX가 PC에 설치되어 있지 않아도 앱 내에서 경량 버전을 준비할 수 있습니다.
부품은 선택하면 가로/세로 크기나 번호를 설정할 수 있으며, 여러 부품을 범위 선택하여 한꺼번에 움직일 수 있습니다. 용지 설정에서는 용지 크기, 여백, 1칸의 크기를 결정하고, 만든 용지는 템플릿으로 등록할 수 있습니다.
새로운 시험에서는 첫 번째 용지로 백지, 번호와 이름 칸이 있는 용지, 공통 테스트용 마크시트(22과목), 등록된 템플릿 등을 선택할 수 있습니다. 도쿄대학 편집판은 수학(문과/이과), 과학, 사회의 A3 네 가지 종류입니다. 그 외에도 수학 및 과학 연습 용지(A4·B5)도 템플릿에 포함되어 있습니다.
실제로 만들 수 있는 용지의 예시입니다. 공통 테스트용 마크시트, 도쿄대학 편집판, 기호와 서술을 조합한 자체 제작 용지 등을 같은 화면에서 만들 수 있습니다.
모범 답안이 들어있는 용지도 출력할 수 있습니다. 빈칸 버전과 같은 종이에 정답을 겹치는 형태로 선생님의 현장용으로 사용할 수 있습니다.
TeX를 몰라도 조작할 수 있는 화면이 만들어졌다고 해도, 가져올 수 있는 용지가 TeX로 만든 것만이라면 사용 가능한 상황은 상당히 제한됩니다. 선생님들이 평소에 사용하는 것은 Word나 Excel로 만든 프린트일 수도 있고, 종이에만 남아있는 교재도 있습니다. 전자 채점을 시작하기 위해 그것들을 전부 TeX로 다시 만들어 달라고 할 수는 없습니다.
직접 KKran을 사용해서 만든 용지라면, 어떤 커맨드로 어느 답안란을 배치했는지 소스를 보면 알 수 있습니다. 하지만 외부에서 가져온 PDF에는 그 전제가 있을 수 없습니다. 화면에 네모난 틀이 표시되어 있어도 그것이 답안란인지, 문제를 둘러싼 틀인지, 단순한 표의 일부인지는 별개의 문제입니다. 게다가 답안란이라고 알아도 그것이 몇 번 문제인지, 기호식인지 서술식인지까지는 외관만으로는 결정할 수 없습니다.
용지를 만드는 방법도 통일되어 있지 않습니다. 독립된 틀도 있고, 표의 셀을 답안란으로 사용한 것도 있습니다. 스캔한 교재에서는 인쇄된 선도 글자도 이미지로 취급하게 됩니다. 같은 PDF라는 형식으로 열릴 수 있는 것과 그 안의 답안란을 채점에 사용할 수 있는 것은 별개의 문제입니다.
여기서는 가져온 PDF에서 답안란 후보를 내는 단계와, 그것을 채점에 사용할 칸으로 확인하는 단계를 분리했습니다. 후보가 나온 시점에서 전부 확정하는 것이 아니라, 선생님이 종이를 보면서 설정을 수정하는 형태입니다.
예를 들어, 서술란인데 기호란으로 후보가 나왔다면 종류를 고치고, 놓친 칸은 '칸을 수동으로 추가'로 범위를 둘러싸서 추가합니다. 틀이 발견되었다는 것만으로는 충분하지 않기 때문에, 문제 번호도 함께 확인해야 합니다.
가져온 교재 위에 답안란 후보를 표시한 화면입니다. 종이를 보면서 채점에 사용할 범위를 확인할 수 있도록 했습니다.
가져오기부터 채점까지의 흐름은 PDF를 열고, 스캔한 답안지를 가져오고, 답안란 후보를 확인하고, 잘라낸 답안지를 채점하는 순서입니다.
이로써 원래 제작 소프트웨어의 정보가 없어도, 채점에 필요한 설정을 화면에서 추가할 수 있게 되었습니다. 어떤 용지든 완전히 자동으로 처리된다는 수준까지는 아니지만, 교재를 다시 만드는 것 외의 시작 방법을 마련한 것입니다.
여기까지 이야기를 전부 쓰면 상당히 길어질 것 같아서, 이번에는 마크시트 읽기 부분만 조금 더 써보겠습니다. 이 부분은 무료 기능으로 제공하기 때문에, 만들 때 생각했던 것을 조금 소개하겠습니다.
무료 판독에서는 미기입 용지와 기입된 답안지를 사용합니다. 등간격으로 배열된 마크란을 대상으로 하며, 양쪽 PDF는 같은 크기와 방향으로 맞출 전제가 있습니다. 미기입 용지는 1페이지, 답안지는 최대 100페이지까지 각각 20MB까지 불러올 수 있습니다. 키 입력이 필요하지 않으며, 판독도 채점도 오프라인에서 작동합니다.
판독 흐름은 미기입 용지와 답안지를 불러오고, 첫 번째 마크란의 위치를 빨간색 틀로 맞추고, 점수와 정오답을 목록으로 확인하는 순서입니다. 옅게 채우거나 이중 마크는 '확인 필요'로 따로 표시합니다.
처음에 필요한 것은 채우기(塗り)를 읽는 것보다, 정말 같은 칸을 보고 있는지 확인하는 것이었습니다. 인쇄해서 스캔하면, 같은 용지라도 위치가 조금씩 어긋납니다. 그대로 비교하면, 테두리를 연필로 칠한 것으로 착각할 때가 있습니다.
그래서 용지에 원래 있는 인쇄를 단서 삼아, 위치의 틀어짐을 조정한 후에 읽는 형태로 만들었습니다. 어디를 보고 있는지 의심스러운 상태에서 채우기 판별만 열심히 하는 것은 무리가 있기 때문입니다.
마크란에는 틀이나 선택지의 글자가 처음부터 인쇄되어 있습니다. 답안의 검은 부분을 그대로 세어보면, 아무것도 쓰지 않은 용지에도 답변이 있는 것처럼 보일 수 있습니다.
여기서 미기입된 용지가 도움이 됩니다. 원래 인쇄물과 나중에 추가된 필기를 구분할 자료가 되기 때문입니다. 스캔에 따라 종이의 밝기도 변하므로, 그 차이도 고려하면서 채우는 부분에 해당하는 부분을 살펴봅니다.
하지만 농도만 안다고 해결되는 것도 아닙니다. 가장 진한 칸을 답으로 하면, 무답 문제에도 어딘가 답변이 붙어버립니다. 옅은 채색이나 지워진 흔적도 있으므로, 농도만으로 즉결하지 않고 채우는 방식까지 포함하여 판단하도록 했습니다. 이 부분은 깨끗한 예본을 본 후에 실제 답안에서 걸렸던 점입니다.
또 하나 신경 쓴 것은, 채점 결과를 내는 것과 확인이 필요한지를 구분하는 것입니다. 옅은 채색이나 지워진 흔적이 있을 때마다 채점을 멈추게 하면, 점수를 보기 위해 먼저 모든 확인을 마칠 필요가 생깁니다.
그래서 읽기가 의심스러운 것에도 자동 채점 결과를 내고, 그 위에 '확인 필요'를 붙이는 형태로 했습니다. 총점도 표시되므로, 먼저 답안 전체의 결과를 보고 궁금한 문제만 확인할 수 있습니다.
그림 예시에서는 10점이라는 채점 결과와 '확인 필요'가 동시에 남습니다.
'확인 필요'가 된 칸은 답안 이미지를 보고 선생님이 결정합니다. 손글씨 답안도 마찬가지로 이미지를 보고 채점할 수 있으며, 읽기 결과는 CSV로 저장할 수 있습니다.
코드 측에서도 점수와 확인 상태를 별도로 가지고 있습니다. 단답의 채점 부분만 축소하면 이런 형태입니다. 구현을 설명용으로 간략화한 예시이며, 읽기 처리 내용은 생략했습니다.
candidate = automatic_answer(reading)
score = points if candidate == answer else 0
needs_review = reading["state"] not in ("single", "blank")
...
automatic_answer는 채점에 사용할 답변 후보를 추출하는 부분입니다. score와 review를 분리해 두면, 점수를 집계하는 처리를 멈추지 않고 확인해야 할 문제만 가져올 수 있습니다.
점수가 나오고 있다고 해서 읽기까지 확실한 것은 아닙니다. '몇 점으로 판정했는지'와 '사람이 확인할 필요가 있는지'를 별도로 다루는 것도 실제로 사용하기 위해서는 필요했던 것 같습니다.
마지막으로, 채점과 반납 화면입니다. 채점 화면 하단에는 만점・0점・부분점 버튼이 있으며, 배점이 늘어나도 버튼은 늘어나지 않습니다. 부분점은 0점에서 배점까지의 정수를 숫자 키패드로 입력하고 Enter로 확정합니다. 답안은 '1명씩', '일람', '용지 전체'로 볼 수 있고, '1명씩'에서는 채점하면 다음 답안으로 넘어갑니다.
채점이 끝나면 학생별 반납 PDF와 점수 CSV를 출력할 수 있습니다. 미채점 문제를 0점으로 출력하는 일은 없습니다. 전 시험을 .scoring64 파일로 백업하고, 나중에 복원하는 것도 가능합니다.
이번에는 전자 채점 소프트웨어를 만들 때 걸렸던 점과, 마크시트를 읽을 때 생각했던 것을 조금 소개했습니다.
Scoring64의 마크시트 읽기(읽기・정오 판정・점수 계산・결과 CSV 저장)는 기간 제한 없이 무료로 사용할 수 있습니다. 용지 작성이나 답안 가져오기, 서술형 답안 채점, 반납까지 다루는 부분은 첫 10일간의 체험 후 유료가 됩니다. 실제 조작이나 다운로드에 대해서는 안내 사이트를 참고해 주십시오.
이 기사는 개발자에 의한 제품 소개입니다. 게재된 조작 화면은 예본 데이터를 사용하고 있습니다. 마크시트 읽기 예시에는 예본용으로 만든 답안을 포함합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기